X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=lib%2FNet%2FHTTPS%2FAny.pm;h=17faa7492159732bb053bd2bea7e45c30cb0c5b6;hb=90a8f96bb101dc637ad436de3c3ab161cc5000d9;hp=c65c7d94d8c639c35a6a11210e873bc4f6298632;hpb=97e89d11919d233afc4bbe3a2c7f14a4d116584b;p=Net-HTTPS-Any.git diff --git a/lib/Net/HTTPS/Any.pm b/lib/Net/HTTPS/Any.pm index c65c7d9..17faa74 100644 --- a/lib/Net/HTTPS/Any.pm +++ b/lib/Net/HTTPS/Any.pm @@ -2,8 +2,8 @@ package Net::HTTPS::Any; 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; @@ -43,15 +43,11 @@ BEGIN { =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 @@ -59,9 +55,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 +65,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 ); @@ -81,10 +77,22 @@ our $VERSION = '0.09'; =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 FUNCTIONS =head2 https_get HASHREF | FIELD => VALUE, ... @@ -105,15 +113,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 is preserved (see L 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 +140,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 = (); @@ -153,18 +168,25 @@ sub https_get { 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' ) { @@ -180,6 +202,7 @@ sub https_get { 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($_) } @@ -213,7 +236,7 @@ For example: { 'X-Header1' => 'value', ... } =item Content-Type -For example: 'text/namevalue', +Defaults to "application/x-www-form-urlencoded" if not specified. =item args @@ -224,6 +247,9 @@ is preserved (see L to do so when passing a hashref). 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 +265,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 +274,7 @@ sub https_post { $post_data = $opts->{'content'}; } + $opts->{'port'} ||= 443; $opts->{"Content-Type"} ||= "application/x-www-form-urlencoded"; ### XXX referer!!! @@ -258,12 +285,20 @@ 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 $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'}, @@ -273,6 +308,8 @@ sub https_post { $opts->{"Content-Type"}, ); + $res_code =~ /^(HTTP\S+ )?(.*)/ and $res_code = $2; + return ( $res_page, $res_code, @res_headers ); } elsif ( $ssl_module eq 'Crypt::SSLeay' ) { @@ -289,6 +326,8 @@ sub https_post { $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] ) ); @@ -327,7 +366,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 +388,9 @@ L =back - -=head1 ACKNOWLEDGEMENTS - - =head1 COPYRIGHT & LICENSE -Copyright 2008 Freeside Internet Services, Inc. (http://freeside.biz/) +Copyright 2008-2010 Freeside Internet Services, Inc. (http://freeside.biz/) All rights reserved. This program is free software; you can redistribute it and/or modify it