use warnings;
use strict;
+use base qw( Exporter );
use vars qw(@EXPORT_OK $ssl_module $skip_NetSSLeay);
-use Exporter;
use URI::Escape;
use Tie::IxHash;
=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 using whichever underlying SSL module is available
=cut
-our $VERSION = '0.09';
+our $VERSION = '0.11';
=head1 SYNOPSIS
( $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
},
( $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
);
=head1 DESCRIPTION
This is a simple wrapper around either of the two available SSL
-modules.
+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.
+
+=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.
+
=head1 FUNCTIONS
=head2 https_get HASHREF | FIELD => VALUE, ...
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
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 = ();
if ( $ssl_module eq 'Net::SSLeay' ) {
+ no warnings 'uninitialized';
+
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"},
+ #"",
+ #$opts->{"Content-Type"},
);
+ $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
+
return ( $res_page, $res_code, @res_headers );
} elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
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($_) }
=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
# 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;
$post_data = $opts->{'content'};
}
+ $opts->{'port'} ||= 443;
$opts->{"Content-Type"} ||= "application/x-www-form-urlencoded";
### XXX referer!!!
$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 $raw_data = ref($post_data) ? make_form(%$post_data) : $post_data;
+ $Net::SSLeay::trace = $opts->{'debug'}
+ if exists $opts->{'debug'} && $opts->{'debug'};
+
my( $res_page, $res_code, @res_headers ) =
post_https( $opts->{'host'},
$opts->{'port'},
$opts->{"Content-Type"},
);
+ $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2;
+
return ( $res_page, $res_code, @res_headers );
} elsif ( $ssl_module eq 'Crypt::SSLeay' ) {
$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] ) );
perldoc Net::HTTPS::Any
-
You can also look for information at:
=over 4
=back
-
-=head1 ACKNOWLEDGEMENTS
-
-
=head1 COPYRIGHT & LICENSE
-Copyright 2008 Freeside Internet Services, Inc. (http://freeside.biz/)
+Copyright 2008-2014 Freeside Internet Services, Inc. (http://freeside.biz/)
All rights reserved.
This program is free software; you can redistribute it and/or modify it