diff options
author | franck cuny <franck@lumberjaph.net> | 2010-09-13 13:31:56 +0200 |
---|---|---|
committer | franck cuny <franck@lumberjaph.net> | 2010-09-13 13:31:56 +0200 |
commit | 3e3dc478fc9b4eb90681df89156dfcc8f7f81481 (patch) | |
tree | b9788b0d48f524bc4c0aeeb48c744a8f7b097910 /lib/Net/HTTP/Spore/Role | |
download | net-http-spore-3e3dc478fc9b4eb90681df89156dfcc8f7f81481.tar.gz |
initial import
Diffstat (limited to 'lib/Net/HTTP/Spore/Role')
-rw-r--r-- | lib/Net/HTTP/Spore/Role/Middleware.pm | 44 | ||||
-rw-r--r-- | lib/Net/HTTP/Spore/Role/Request.pm | 82 | ||||
-rw-r--r-- | lib/Net/HTTP/Spore/Role/UserAgent.pm | 22 |
3 files changed, 148 insertions, 0 deletions
diff --git a/lib/Net/HTTP/Spore/Role/Middleware.pm b/lib/Net/HTTP/Spore/Role/Middleware.pm new file mode 100644 index 0000000..dd2c1c5 --- /dev/null +++ b/lib/Net/HTTP/Spore/Role/Middleware.pm @@ -0,0 +1,44 @@ +package Net::HTTP::Spore::Role::Middleware; + +use Moose::Role; + +has middlewares => ( + is => 'rw', + isa => 'ArrayRef', + traits => ['Array'], + lazy => 1, + default => sub { [] }, + auto_deref => 1, + handles => { _add_middleware => 'push', _filter_middlewares => 'grep'}, +); + +sub _load_middleware { + my ( $self, $mw, @args ) = @_; + + Class::MOP::load_class($mw); + + my $code = $mw->wrap( @args ); + $self->_add_middleware($code); +} + +sub enable { + my ($self, $mw, @args) = @_; + + if ($mw !~ /(?:^\+|Net\:\:HTTP\:\:Spore\:\:Middleware)/) { + $mw = "Net::HTTP::Spore::Middleware::".$mw; + } + $self->_load_middleware($mw, @args); + $self; +} + +sub enable_if { + my ($self, $cond, $mw, @args) = @_; + $self; +} + +sub reset_middlewares { + my $self = shift; + $self->middlewares([]); +} + +1; diff --git a/lib/Net/HTTP/Spore/Role/Request.pm b/lib/Net/HTTP/Spore/Role/Request.pm new file mode 100644 index 0000000..840917a --- /dev/null +++ b/lib/Net/HTTP/Spore/Role/Request.pm @@ -0,0 +1,82 @@ +package Net::HTTP::Spore::Role::Request; + +# ABSTRACT: make HTTP request + +use Try::Tiny; +use Moose::Role; +use MooseX::Types::URI qw/Uri/; + +use Net::HTTP::Spore::Request; + +has api_base_url => ( + is => 'rw', + isa => Uri, + coerce => 1, + required => 1, +); + +sub http_request { + my ( $self, $env ) = @_; + + my ($request, $response); + $request = Net::HTTP::Spore::Request->new($env); + + my @middlewares; + foreach my $mw ( $self->middlewares ) { + my $res; + try { + $res = $mw->($request); + } + catch { + $res = $request->new_response( 599, [], { error => $_, } ); + }; + + if ( ref $res && ref $res eq 'CODE' ) { + push @middlewares, $res; + } + elsif ( ref $res && ref $res eq 'Net::HTTP::Spore::Response' ) { + return $res if ($res->status == 599); + $response = $res; + last; + } + } + + if (defined $response) { + map { $_->($response) } reverse @middlewares; + return $response; + } + + my $result = $self->request($request->finalize); + + $response = $request->new_response( + $result->code, + $result->headers, + $result->content, + ); + + map { $_->($response) } reverse @middlewares; + + $response; +} + +1; + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +=head2 METHODS + +=over 4 + +=item B<http_request> + +=back + +=head2 ATTRIBUTES + +=over 4 + +=item B<api_base_url> + +=back diff --git a/lib/Net/HTTP/Spore/Role/UserAgent.pm b/lib/Net/HTTP/Spore/Role/UserAgent.pm new file mode 100644 index 0000000..6bfaa5a --- /dev/null +++ b/lib/Net/HTTP/Spore/Role/UserAgent.pm @@ -0,0 +1,22 @@ +package Net::HTTP::Spore::Role::UserAgent; + +# ABSTRACT: create UserAgent + +use Moose::Role; +use LWP::UserAgent; + +has api_useragent => ( + is => 'rw', + isa => 'LWP::UserAgent', + lazy => 1, + handles => [qw/request/], + default => sub { + my $self = shift; + my $ua = LWP::UserAgent->new(); + $ua->agent( "Net::HTTP::Spore v" . $Net::HTTP::Spore::VERSION . " (Perl)" ); + $ua->env_proxy; + return $ua; + } +); + +1; |