From 90eca2090a47dd4755de4fa707597ff2c025ecaa Mon Sep 17 00:00:00 2001 From: ivan Date: Sat, 1 May 2010 20:05:57 +0000 Subject: [PATCH] - Pull in changes from Business::OnlinePayment::HTTPS 0.09 from Business::OnlinePayment 3.00 - Default Content-Type to application/x-www-form-urlencoded - Added WHY THIS MODULE section to POD - Updated tests for new world of not returning HTTP as part of the response code - Removed meaningless Content-Type handling from https_get - Added/documented debugging option --- Changes | 15 +++++++++++-- Makefile.PL | 5 +++++ lib/Net/HTTPS/Any.pm | 61 +++++++++++++++++++++++++++++++++------------------- t/get-cryptssleay.t | 6 ++++-- t/get-netssleay.t | 6 ++++-- t/post-cryptssleay.t | 6 ++++-- t/post-netssleay.t | 6 ++++-- 7 files changed, 73 insertions(+), 32 deletions(-) diff --git a/Changes b/Changes index 32caa87..de27f8b 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,17 @@ Revision history for Net-HTTPS-Any +0.10 unreleased + - Pull in changes from Business::OnlinePayment::HTTPS 0.09 from + Business::OnlinePayment 3.00 + - Default Content-Type to application/x-www-form-urlencoded + - Added WHY THIS MODULE section to POD + - Updated tests for new world of not returning HTTP as part of the + response code + - Removed meaningless Content-Type handling from https_get + - Added/documented debugging option + 0.09 unrelesed - First version numbered 0.09 - (based on Business::OnlinePayment::HTTPS 0.08) + - First version numbered 0.09 (based on + Business::OnlinePayment::HTTPS 0.08 from + Business::OnlinePayment 3.00_08) diff --git a/Makefile.PL b/Makefile.PL index c6dbbc8..2fe34d0 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -12,6 +12,11 @@ WriteMakefile( 'Test::More' => 0, 'URI::Escape' => 0, 'Tie::IxHash' => 0, + # If you are aware of a way to declare an OR relation in prerequisites, + # please tell me, you would be my hero. it doesn't have to be EU:MM. + # 'Net::SSLeay' => 0, + # or 'Crypt::SSLeay' => 0, + # 'LWP' => 0, }, dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, clean => { FILES => 'Net-HTTPS-Any-*' }, diff --git a/lib/Net/HTTPS/Any.pm b/lib/Net/HTTPS/Any.pm index d42b618..e03c5d7 100644 --- a/lib/Net/HTTPS/Any.pm +++ b/lib/Net/HTTPS/Any.pm @@ -2,12 +2,11 @@ package Net::HTTPS::Any; use warnings; use strict; -use vars qw(@ISA @EXPORT_OK $ssl_module $skip_NetSSLeay); -use Exporter; +use base qw( Exporter ); +use vars qw(@EXPORT_OK $ssl_module $skip_NetSSLeay); use URI::Escape; use Tie::IxHash; -@ISA = qw( Exporter ); @EXPORT_OK = qw( https_get https_post ); BEGIN { @@ -44,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 class using whichever underlying SSL module is available =cut -our $VERSION = '0.09'; +our $VERSION = '0.10'; =head1 SYNOPSIS @@ -82,11 +77,22 @@ our $VERSION = '0.09'; =head1 DESCRIPTION This is a simple wrapper around either of the two available SSL -modules. It offers a unified API for send GET and POST requests over HTTPS +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, ... @@ -107,9 +113,11 @@ 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 @@ -118,6 +126,8 @@ 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 @@ -130,7 +140,7 @@ 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 = $opts->{'args'}; } elsif ( exists($opts->{'args'}) && ref($opts->{'args'}) eq 'ARRAY' ) { @@ -169,10 +179,12 @@ sub https_get { $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' ) { @@ -222,7 +234,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 @@ -233,6 +245,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 @@ -272,6 +287,11 @@ sub https_post { import Net::SSLeay qw(post_https make_headers make_form); my $headers = make_headers(%headers); + if ($opts->{debug}) { + no warnings 'uninitialized'; + $Net::SSLeay::trace = $opts->{debug}; + } + my $raw_data = ref($post_data) ? make_form(%$post_data) : $post_data; $Net::SSLeay::trace = $opts->{'debug'} @@ -286,6 +306,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' ) { @@ -342,7 +364,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 @@ -365,13 +386,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 diff --git a/t/get-cryptssleay.t b/t/get-cryptssleay.t index 920f50a..43ac5f4 100644 --- a/t/get-cryptssleay.t +++ b/t/get-cryptssleay.t @@ -21,7 +21,8 @@ my($content, $response, %headers) = https_get( 'net_https_any_test' => 1, ); -like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (OK) response'); +#like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (OK) response'); +like($response, qr/^200/i, 'Received 200 (OK) response'); ok( length($content), 'Received content' ); @@ -35,5 +36,6 @@ my($content2, $response2, %headers2) = https_get( 'net_https_any_test' => 1, ); -like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (OK) response'); +#like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (Not found) response'); +like($response2, qr/^404/i, 'Received 404 (Not found) response'); diff --git a/t/get-netssleay.t b/t/get-netssleay.t index d36111d..22a7e23 100644 --- a/t/get-netssleay.t +++ b/t/get-netssleay.t @@ -19,7 +19,8 @@ my($content, $response, %headers) = https_get( 'net_https_any_test' => 1, ); -like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (OK) response'); +#like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (OK) response'); +like($response, qr/^200/i, 'Received 200 (OK) response'); ok( length($content), 'Received content' ); @@ -33,5 +34,6 @@ my($content2, $response2, %headers2) = https_get( 'net_https_any_test' => 1, ); -like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (OK) response'); +#like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (Not Found) response'); +like($response2, qr/^404/i, 'Received 404 (Not Found) response'); diff --git a/t/post-cryptssleay.t b/t/post-cryptssleay.t index 2bf52ff..c9f13ab 100644 --- a/t/post-cryptssleay.t +++ b/t/post-cryptssleay.t @@ -21,7 +21,8 @@ my($content, $response, %headers) = https_post( 'net_https_any_test' => 1, ); -like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (OK) response'); +#like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (Not Found) response'); +like($response, qr/^200/i, 'Received 200 (Not Found) response'); ok( length($content), 'Received content' ); @@ -35,5 +36,6 @@ my($content2, $response2, %headers2) = https_post( 'net_https_any_test' => 1, ); -like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (OK) response'); +#like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (OK) response'); +like($response2, qr/^404/i, 'Received 404 (OK) response'); diff --git a/t/post-netssleay.t b/t/post-netssleay.t index 14fc98b..307bdb3 100644 --- a/t/post-netssleay.t +++ b/t/post-netssleay.t @@ -19,7 +19,8 @@ my($content, $response, %headers) = https_post( 'net_https_any_test' => 1, ); -like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (OK) response'); +#like($response, qr/^HTTP\/[\d\.]+\s+200/i, 'Received 200 (OK) response'); +like($response, qr/^200/i, 'Received 200 (OK) response'); ok( length($content), 'Received content' ); @@ -33,5 +34,6 @@ my($content2, $response2, %headers2) = https_post( 'net_https_any_test' => 1, ); -like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (OK) response'); +#like($response2, qr/^HTTP\/[\d\.]+\s+404/i, 'Received 404 (Not Found) response'); +like($response2, qr/^404/i, 'Received 404 (Not Found) response'); -- 2.11.0