quiet Net::SSLeay warnings
[Net-HTTPS-Any.git] / lib / Net / HTTPS / Any.pm
index c65c7d9..e3b51dc 100644 (file)
@@ -2,56 +2,21 @@ package Net::HTTPS::Any;
 
 use warnings;
 use strict;
-use vars qw(@EXPORT_OK $ssl_module $skip_NetSSLeay);
-use Exporter;
+use base qw( Exporter );
+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 class using whatever underlying module is available
-
-=head1 VERSION
-
-Version 0.09
+Net::HTTPS::Any - Simple HTTPS client
 
 =cut
 
-our $VERSION = '0.09';
+our $VERSION = '0.13';
 
 =head1 SYNOPSIS
 
@@ -59,9 +24,9 @@ our $VERSION = '0.09';
   
   ( $page, $response, %reply_headers )
       = https_get(
-                   { 'host' => 'secure.sisd.com',
+                   { 'host' => 'www.fortify.net',
                      'port' => 443,
-                     'path' => '/freeside/index.html',
+                     'path' => '/sslcheck.html',
                      'args' => { 'field' => 'value' },
                      #'args' => [ 'field'=>'value' ], #order preserved
                    },
@@ -69,9 +34,9 @@ our $VERSION = '0.09';
 
   ( $page, $response, %reply_headers )
       = https_post(
-                    'host' => 'secure.sisd.com',
+                    'host' => 'www.google.com',
                     'port' => 443,
-                    'path' => '/freeside/index.html',
+                    'path' => '/accounts/ServiceLoginAuth',
                     'args' => { 'field' => 'value' },
                     #'args' => [ 'field'=>'value' ], #order preserved
                   );
@@ -80,10 +45,13 @@ our $VERSION = '0.09';
 
 =head1 DESCRIPTION
 
-This is a simple wrapper around either of the two available SSL
-modules.
+This is a wrapper around Net::SSLeay providing a simple interface for the use
+of Business::OnlinePayment.
 
-It depends on Net::SSLeay _or_ ( Crypt::SSLeay and LWP::UserAgent ).
+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
 
@@ -105,15 +73,21 @@ Parameters are:
 
 For example: { 'X-Header1' => 'value', ... }
 
-=item Content-Type
+=cut
 
-For example: 'text/namevalue',
+# =item Content-Type
+# 
+# Defaults to "application/x-www-form-urlencoded" if not specified.
 
 =item args
 
-CGI arguments, eitehr as a hashref or a listref.  In the latter case, ordering
+CGI arguments, either as a hashref or a listref.  In the latter case, ordering
 is preserved (see L<Tie::IxHash> to do so when passing a hashref).
 
+=item debug
+
+Set true to enable debugging.
+
 =back
 
 Returns a list consisting of the page content as a string, the HTTP
@@ -126,15 +100,16 @@ sub https_get {
     my $opts = ref($_[0]) ? shift : { @_ }; #hashref or list
 
     # accept a hashref or a list (keep it ordered)
-    my $post_data = {};
+    my $post_data = {}; # technically get_data, pedant
     if (      exists($opts->{'args'}) && ref($opts->{'args'}) eq 'HASH'  ) {
-        $post_data = shift;
+        $post_data = $opts->{'args'};
     } elsif ( exists($opts->{'args'}) && ref($opts->{'args'}) eq 'ARRAY' ) {
         tie my %hash, 'Tie::IxHash', @{ $opts->{'args'} };
         $post_data = \%hash;
     }
 
-    $opts->{"Content-Type"} ||= "application/x-www-form-urlencoded";
+    $opts->{'port'} ||= 443;
+    #$opts->{"Content-Type"} ||= "application/x-www-form-urlencoded";
 
     ### XXX referer!!!
     my %headers = ();
@@ -151,45 +126,25 @@ sub https_get {
               keys %$post_data );
     }
 
-    if ( $ssl_module eq 'Net::SSLeay' ) {
+    my $headers = make_headers(%headers);
 
-        import Net::SSLeay qw(get_https make_headers);
-        my $headers = make_headers(%headers);
+    $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"},
-                   );
+    no warnings 'uninitialized';
 
-        return ( $res_page, $res_code, @res_headers );
+    my( $res_page, $res_code, @res_headers ) =
+      get_https( $opts->{'host'},
+                 $opts->{'port'},
+                 $path,
+                 $headers,
+                 #"",
+                 #$opts->{"Content-Type"},
+               );
 
-    } elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
+    $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
 
-        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} );
-        }
-        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 );
 
 }
 
@@ -213,17 +168,20 @@ For example: { 'X-Header1' => 'value', ... }
 
 =item Content-Type
 
-For example: 'text/namevalue',
+Defaults to "application/x-www-form-urlencoded" if not specified.
 
 =item args
 
-CGI arguments, eitehr as a hashref or a listref.  In the latter case, ordering
+CGI arguments, either as a hashref or a listref.  In the latter case, ordering
 is preserved (see L<Tie::IxHash> to do so when passing a hashref).
 
 =item content
 
 Raw content (overrides args).  A simple scalar containing the raw content.
 
+=item debug
+
+Set true to enable debugging in the underlying SSL module.
 
 =back
 
@@ -239,7 +197,7 @@ sub https_post {
     # accept a hashref or a list (keep it ordered).  or a scalar of content.
     my $post_data = '';
     if (      exists($opts->{'args'}) && ref($opts->{'args'}) eq 'HASH'  ) {
-        $post_data = shift;
+        $post_data = $opts->{'args'};
     } elsif ( exists($opts->{'args'}) && ref($opts->{'args'}) eq 'ARRAY' ) {
         tie my %hash, 'Tie::IxHash', @{ $opts->{'args'} };
         $post_data = \%hash;
@@ -248,6 +206,7 @@ sub https_post {
         $post_data = $opts->{'content'};
     }
 
+    $opts->{'port'} ||= 443;
     $opts->{"Content-Type"} ||= "application/x-www-form-urlencoded";
 
     ### XXX referer!!!
@@ -257,57 +216,30 @@ sub https_post {
     }
     $headers{'Host'} ||= $opts->{'host'};
 
-    if ( $ssl_module eq 'Net::SSLeay' ) {
-
-        import Net::SSLeay qw(post_https make_headers make_form);
-        my $headers = make_headers(%headers);
-
-        my $raw_data = ref($post_data) ? make_form(%$post_data) : $post_data;
+    my $headers = make_headers(%headers);
 
-        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'};
 
-        return ( $res_page, $res_code, @res_headers );
+    my $raw_data = ref($post_data) ? make_form(%$post_data) : $post_data;
 
-    } elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
+    $Net::SSLeay::trace = $opts->{'debug'}
+      if exists $opts->{'debug'} && $opts->{'debug'};
 
-        import HTTP::Request::Common qw(POST);
+    no warnings 'uninitialized';
 
-        my $url = 'https://' . $opts->{'host'};
-        $url .= ':' . $opts->{'port'}
-          unless $opts->{'port'} == 443;
-        $url .= $opts->{'path'};
+    my( $res_page, $res_code, @res_headers ) =
+      post_https( $opts->{'host'},
+                  $opts->{'port'},
+                  $opts->{'path'},
+                  $headers,
+                  $raw_data,
+                  $opts->{"Content-Type"},
+                );
 
-        my $ua = new LWP::UserAgent;
-        foreach my $hdr ( keys %headers ) {
-            $ua->default_header( $hdr => $headers{$hdr} );
-        }
+    $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
 
-        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 );
 
 }
 
@@ -327,7 +259,6 @@ You can find documentation for this module with the perldoc command.
 
     perldoc Net::HTTPS::Any
 
-
 You can also look for information at:
 
 =over 4
@@ -350,13 +281,9 @@ L<http://search.cpan.org/dist/Net-HTTPS-Any>
 
 =back
 
-
-=head1 ACKNOWLEDGEMENTS
-
-
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2008 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