From aa41217a463e1bc0ba21bb3e4c8b36e87bfad99a Mon Sep 17 00:00:00 2001 From: franck cuny Date: Tue, 19 Oct 2010 21:59:07 +0200 Subject: new middlewares: * fileupload: upload a file (will detect mime type to set appropriate headers) * paranoidagent: handle blacklist and whitelist * redirection: follows HTTP redirection (HTTP status 30*) * test for redirection --- lib/Net/HTTP/Spore/Middleware/FileUpload.pm | 12 +++++++ lib/Net/HTTP/Spore/Middleware/ParanoidAgent.pm | 13 ++++++++ lib/Net/HTTP/Spore/Middleware/Redirection.pm | 44 ++++++++++++++++++++++++++ t/spore-middleware/redirection.t | 27 ++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 lib/Net/HTTP/Spore/Middleware/FileUpload.pm create mode 100644 lib/Net/HTTP/Spore/Middleware/ParanoidAgent.pm create mode 100644 lib/Net/HTTP/Spore/Middleware/Redirection.pm create mode 100644 t/spore-middleware/redirection.t diff --git a/lib/Net/HTTP/Spore/Middleware/FileUpload.pm b/lib/Net/HTTP/Spore/Middleware/FileUpload.pm new file mode 100644 index 0000000..6677e54 --- /dev/null +++ b/lib/Net/HTTP/Spore/Middleware/FileUpload.pm @@ -0,0 +1,12 @@ +package Net::HTTP::Spore::Middleware::FileUpload; + +use Moose; +extends 'Net::HTTP::Spore::Middleware'; + +use LWP::MediaTypes qw/read_media_types/; + +sub call { + my ($self, $request) = @_; +} + +1; diff --git a/lib/Net/HTTP/Spore/Middleware/ParanoidAgent.pm b/lib/Net/HTTP/Spore/Middleware/ParanoidAgent.pm new file mode 100644 index 0000000..c1cce0c --- /dev/null +++ b/lib/Net/HTTP/Spore/Middleware/ParanoidAgent.pm @@ -0,0 +1,13 @@ +package Net::HTTP::Spore::Middleware::ParanoidAgent; + +use Moose; +extends 'Net::HTTP::Spore::Middleware'; + +has black_list => (); +has white_list => (); + +sub call { + my ($self, $request) = @_; +} + +1; diff --git a/lib/Net/HTTP/Spore/Middleware/Redirection.pm b/lib/Net/HTTP/Spore/Middleware/Redirection.pm new file mode 100644 index 0000000..07046d8 --- /dev/null +++ b/lib/Net/HTTP/Spore/Middleware/Redirection.pm @@ -0,0 +1,44 @@ +package Net::HTTP::Spore::Middleware::Redirection; + +use Moose; + +extends 'Net::HTTP::Spore::Middleware'; + +with 'Net::HTTP::Spore::Role::Request', 'Net::HTTP::Spore::Role::UserAgent'; + +has max_redirect => ( is => 'rw', isa => 'Int', lazy => 1, default => 5 ); + +sub call { + my ( $self, $req ) = @_; + + my $nredirect = 0; + + return $self->response_cb( + sub { + my $res = shift; + while ( $nredirect < $self->max_redirect ) { + my $location = $res->header('location'); + my $status = $res->status; + if ( + $location + and ( $status == 301 + or $status == 302 + or $status == 303 + or $status == 307 ) + ) + { + my $uri = URI->new($location); + $req->env->{HTTP_HOST} = $uri->host; + $req->env->{PATH_INFO} = $uri->path; + $res = $self->_request($req); + $nredirect++; + }else{ + last; + } + } + return $res; + } + ); +} + +1; diff --git a/t/spore-middleware/redirection.t b/t/spore-middleware/redirection.t new file mode 100644 index 0000000..0084956 --- /dev/null +++ b/t/spore-middleware/redirection.t @@ -0,0 +1,27 @@ +use strict; +use warnings; + +use Test::More; + +plan tests => 2; + +use Net::HTTP::Spore; + +SKIP: { + skip "require RUN_HTTP_TEST", 2 unless $ENV{RUN_HTTP_TEST}; + my $client = Net::HTTP::Spore->new_from_string( + '{ + "base_url" : "http://fperrad.googlepages.com", + "name" : "googlepages", + "methods" + : { "get_home" + : { "path" : "/home", "method" : "GET", "expected_status" : [200] } } + }'); + + $client->enable(' Redirection '); + + my $r = $client->get_home(); + is $r->status, 200; + is $r->request->uri, + 'http://sites.google.com/site/fperrad/home '; +} -- cgit 1.4.1 From df0971d28c7e8251314efdb278c2a1a7009d30a8 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Tue, 19 Oct 2010 22:00:28 +0200 Subject: small updates on request: * abstract method to execute middlewares on response * on response callback, middlewares can return a Net::HTTP::Spore::Response object * method _request --- lib/Net/HTTP/Spore/Role/Request.pm | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/lib/Net/HTTP/Spore/Role/Request.pm b/lib/Net/HTTP/Spore/Role/Request.pm index ddd52e6..d22a721 100644 --- a/lib/Net/HTTP/Spore/Role/Request.pm +++ b/lib/Net/HTTP/Spore/Role/Request.pm @@ -33,22 +33,40 @@ sub http_request { } } - if (defined $response) { - map { $_->($response) } reverse @middlewares; - return $response; + return + $self->_execute_middlewares_on_response( $response, @middlewares ) + if defined $response; + + $response = $self->_request($request); + + return $self->_execute_middlewares_on_response( $response, @middlewares ); +} + +sub _execute_middlewares_on_response { + my ($self, $response, @middlewares) = @_; + + foreach my $mw ( reverse @middlewares ) { + my $res = $mw->($response); + $response = $res + if ( defined $res + && Scalar::Util::blessed($res) + && $res->isa('Net::HTTP::Spore::Response') ); } + $response; +} + +sub _request { + my ($self, $request) = @_; + my $result = $self->request($request->finalize); - $response = $request->new_response( + my $response = $request->new_response( $result->code, $result->headers, $result->content, ); - - map { $_->($response) } reverse @middlewares; - - $response; + return $response; } 1; -- cgit 1.4.1 From 7c6e8153b1f257516f62fbc82635ca9aef0267f3 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Tue, 19 Oct 2010 22:01:52 +0200 Subject: by default, no redirect --- lib/Net/HTTP/Spore/Role/UserAgent.pm | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/Net/HTTP/Spore/Role/UserAgent.pm b/lib/Net/HTTP/Spore/Role/UserAgent.pm index 6bfaa5a..9b99ab8 100644 --- a/lib/Net/HTTP/Spore/Role/UserAgent.pm +++ b/lib/Net/HTTP/Spore/Role/UserAgent.pm @@ -15,6 +15,7 @@ has api_useragent => ( my $ua = LWP::UserAgent->new(); $ua->agent( "Net::HTTP::Spore v" . $Net::HTTP::Spore::VERSION . " (Perl)" ); $ua->env_proxy; + $ua->max_redirect(0); return $ua; } ); -- cgit 1.4.1 From df046e8024213fb5bd0fe3458111ceb84f6fbbbe Mon Sep 17 00:00:00 2001 From: franck cuny Date: Tue, 19 Oct 2010 22:01:59 +0200 Subject: fix test --- t/spore-middleware/redirection.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/t/spore-middleware/redirection.t b/t/spore-middleware/redirection.t index 0084956..fe239f9 100644 --- a/t/spore-middleware/redirection.t +++ b/t/spore-middleware/redirection.t @@ -18,10 +18,10 @@ SKIP: { : { "path" : "/home", "method" : "GET", "expected_status" : [200] } } }'); - $client->enable(' Redirection '); + $client->enable('Redirection'); my $r = $client->get_home(); is $r->status, 200; is $r->request->uri, - 'http://sites.google.com/site/fperrad/home '; + 'http://sites.google.com/site/fperrad/home'; } -- cgit 1.4.1 From e7dfc750a97155dc4f7616c5fbbb831b221f5594 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Sat, 30 Oct 2010 12:49:21 +0200 Subject: add headers --- lib/Net/HTTP/Spore/Meta/Method.pm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Net/HTTP/Spore/Meta/Method.pm b/lib/Net/HTTP/Spore/Meta/Method.pm index 54967e9..b546d74 100644 --- a/lib/Net/HTTP/Spore/Meta/Method.pm +++ b/lib/Net/HTTP/Spore/Meta/Method.pm @@ -68,6 +68,11 @@ has formats => ( isa => ArrayRef [Str], predicate => 'has_formats', ); +has headers => ( + is => 'ro', + isa => HashRef [Str], + predicate => 'has_headers', +); has expected_status => ( traits => ['Array'], is => 'ro', -- cgit 1.4.1