Get rid of the LWP codepath, now just a simple wrapper for Business::OnlinePayment
[Net-HTTPS-Any.git] / lib / Net / HTTPS / Any.pm
index 862d44a..8224494 100644 (file)
@@ -3,51 +3,20 @@ package Net::HTTPS::Any;
 use warnings;
 use strict;
 use base qw( Exporter );
-use vars qw(@EXPORT_OK $ssl_module $skip_NetSSLeay);
+use vars qw( @EXPORT_OK );
 use URI::Escape;
 use Tie::IxHash;
+use Net::SSLeay 1.30, qw( get_https post_https make_headers make_form );
 
 @EXPORT_OK = qw( https_get https_post );
 
-BEGIN {
-
-    $ssl_module = '';
-
-    eval {
-        die if defined($skip_NetSSLeay) && $skip_NetSSLeay;
-        require Net::SSLeay;
-        Net::SSLeay->VERSION(1.30);
-
-        #import Net::SSLeay
-        #  qw(get_https post_https make_form make_headers);
-        $ssl_module = 'Net::SSLeay';
-    };
-
-    if ($@) {
-        eval {
-            require LWP::UserAgent;
-            require HTTP::Request::Common;
-            require Crypt::SSLeay;
-
-            #import HTTP::Request::Common qw(GET POST);
-            $ssl_module = 'Crypt::SSLeay';
-        };
-    }
-
-    unless ($ssl_module) {
-        die "One of Net::SSLeay (v1.30 or later)"
-          . " or Crypt::SSLeay (+LWP) is required";
-    }
-
-}
-
 =head1 NAME
 
-Net::HTTPS::Any - Simple HTTPS client using whichever underlying SSL module is available
+Net::HTTPS::Any - Simple HTTPS client
 
 =cut
 
-our $VERSION = '0.11';
+our $VERSION = '0.12';
 
 =head1 SYNOPSIS
 
@@ -76,33 +45,13 @@ our $VERSION = '0.11';
 
 =head1 DESCRIPTION
 
-This is a simple wrapper around either of the two available SSL
-modules.  It offers a unified API for sending GET and POST requests over HTTPS
-and receiving responses.
-
-It depends on Net::SSLeay _or_ ( Crypt::SSLeay and LWP::UserAgent ).
-
-=head1 WHY THIS MODULE
-
-If you just want to write something that speaks HTTPS, you don't need this
-module.  Just go ahead and use whichever of the two modules is good for you.
-Don't worry about it.
-
-On the other hand, if you are a CPAN author or distribute a Perl application,
-especially if you aim to support multiple OSes/disributions, using this module
-for speaking HTTPS may make things easier on your users.  It allows your code
-to be used with either SSL implementation.
+This is a wrapper around Net::SSLeay providing a simple interface for the use
+of Business::OnlinePayment.
 
-=head1 FUTURE
-
-Using LWP::Protocol::https 6.02 or later, the LWP path actually uses
-Net::SSLeay also instead of Crypt::SSLeay.  Going forward that makes this
-module more of historical interest, especially so since modern LWP has its own
-mechanism to force use of Crypt::SSLeay:
-  $Net::HTTPS::SSL_SOCKET_CLASS = "Net::SSL";
-
-Therefore this module will likely eventually become a wrapper around a single
-codepath, driven by the conservative needs of Business::OnlinePayment::HTTPS.
+It used to allow switching between Net::SSLeay and Crypt::SSLeay
+implementations, but that was obsoleted.  If you need to do that, use LWP
+instead.  You can set $Net::HTTPS::SSL_SOCKET_CLASS = "Net::SSL" for
+Crypt::SSLeay instead of the default Net::SSLeay (since 6.02).
 
 =head1 FUNCTIONS
 
@@ -177,53 +126,23 @@ sub https_get {
               keys %$post_data );
     }
 
-    if ( $ssl_module eq 'Net::SSLeay' ) {
-
-        no warnings 'uninitialized';
-
-        import Net::SSLeay qw(get_https make_headers);
-        my $headers = make_headers(%headers);
+    my $headers = make_headers(%headers);
 
-        $Net::SSLeay::trace = $opts->{'debug'}
-          if exists $opts->{'debug'} && $opts->{'debug'};
+    $Net::SSLeay::trace = $opts->{'debug'}
+      if exists $opts->{'debug'} && $opts->{'debug'};
 
-        my( $res_page, $res_code, @res_headers ) =
-          get_https( $opts->{'host'},
-                     $opts->{'port'},
-                     $path,
-                     $headers,
-                     #"",
-                     #$opts->{"Content-Type"},
-                   );
+    my( $res_page, $res_code, @res_headers ) =
+      get_https( $opts->{'host'},
+                 $opts->{'port'},
+                 $path,
+                 $headers,
+                 #"",
+                 #$opts->{"Content-Type"},
+               );
 
-        $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
+    $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
 
-        return ( $res_page, $res_code, @res_headers );
-
-    } elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
-
-        import HTTP::Request::Common qw(GET);
-
-        my $url = 'https://' . $opts->{'host'};
-        $url .= ':' . $opts->{'port'}
-          unless $opts->{'port'} == 443;
-        $url .= "/$path";
-
-        my $ua = new LWP::UserAgent;
-        foreach my $hdr ( keys %headers ) {
-            $ua->default_header( $hdr => $headers{$hdr} );
-        }
-        $ENV{HTTPS_DEBUG} = $opts->{'debug'} if exists $opts->{'debug'};
-        my $res = $ua->request( GET($url) );
-
-        my @res_headers = map { $_ => $res->header($_) }
-                              $res->header_field_names;
-
-        return ( $res->content, $res->code. ' '. $res->message, @res_headers );
-
-    } else {
-        die "unknown SSL module $ssl_module";
-    }
+    return ( $res_page, $res_code, @res_headers );
 
 }
 
@@ -295,69 +214,28 @@ sub https_post {
     }
     $headers{'Host'} ||= $opts->{'host'};
 
-    if ( $ssl_module eq 'Net::SSLeay' ) {
-        
-        no warnings 'uninitialized';
-
-        import Net::SSLeay qw(post_https make_headers make_form);
-        my $headers = make_headers(%headers);
-
-        $Net::SSLeay::trace = $opts->{'debug'}
-          if exists $opts->{'debug'} && $opts->{'debug'};
+    my $headers = make_headers(%headers);
 
-        my $raw_data = ref($post_data) ? make_form(%$post_data) : $post_data;
+    $Net::SSLeay::trace = $opts->{'debug'}
+      if exists $opts->{'debug'} && $opts->{'debug'};
 
-        $Net::SSLeay::trace = $opts->{'debug'}
-          if exists $opts->{'debug'} && $opts->{'debug'};
+    my $raw_data = ref($post_data) ? make_form(%$post_data) : $post_data;
 
-        my( $res_page, $res_code, @res_headers ) =
-          post_https( $opts->{'host'},
-                      $opts->{'port'},
-                      $opts->{'path'},
-                      $headers,
-                      $raw_data,
-                      $opts->{"Content-Type"},
-                    );
+    $Net::SSLeay::trace = $opts->{'debug'}
+      if exists $opts->{'debug'} && $opts->{'debug'};
 
-        $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
+    my( $res_page, $res_code, @res_headers ) =
+      post_https( $opts->{'host'},
+                  $opts->{'port'},
+                  $opts->{'path'},
+                  $headers,
+                  $raw_data,
+                  $opts->{"Content-Type"},
+                );
 
-        return ( $res_page, $res_code, @res_headers );
+    $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
 
-    } elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
-
-        import HTTP::Request::Common qw(POST);
-
-        my $url = 'https://' . $opts->{'host'};
-        $url .= ':' . $opts->{'port'}
-          unless $opts->{'port'} == 443;
-        $url .= $opts->{'path'};
-
-        my $ua = new LWP::UserAgent;
-        foreach my $hdr ( keys %headers ) {
-            $ua->default_header( $hdr => $headers{$hdr} );
-        }
-
-        $ENV{HTTPS_DEBUG} = $opts->{'debug'} if exists $opts->{'debug'};
-
-        my $res;
-        if ( ref($post_data) ) {
-            $res = $ua->request( POST( $url, [%$post_data] ) );
-        }
-        else {
-            my $req = new HTTP::Request( 'POST' => $url );
-            $req->content_type( $opts->{"Content-Type"} );
-            $req->content($post_data);
-            $res = $ua->request($req);
-        }
-
-        my @res_headers = map { $_ => $res->header($_) }
-                              $res->header_field_names;
-
-        return ( $res->content, $res->code. ' '. $res->message, @res_headers );
-
-    } else {
-        die "unknown SSL module $ssl_module";
-    }
+    return ( $res_page, $res_code, @res_headers );
 
 }
 
@@ -401,7 +279,7 @@ L<http://search.cpan.org/dist/Net-HTTPS-Any>
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2008-2014 Freeside Internet Services, Inc. (http://freeside.biz/)
+Copyright 2008-2016 Freeside Internet Services, Inc. (http://freeside.biz/)
 All rights reserved.
 
 This program is free software; you can redistribute it and/or modify it