summaryrefslogtreecommitdiff
path: root/lib/Net/HTTP/Spore/Role
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2010-09-13 13:31:56 +0200
committerfranck cuny <franck@lumberjaph.net>2010-09-13 13:31:56 +0200
commit3e3dc478fc9b4eb90681df89156dfcc8f7f81481 (patch)
treeb9788b0d48f524bc4c0aeeb48c744a8f7b097910 /lib/Net/HTTP/Spore/Role
downloadnet-http-spore-3e3dc478fc9b4eb90681df89156dfcc8f7f81481.tar.gz
initial import
Diffstat (limited to 'lib/Net/HTTP/Spore/Role')
-rw-r--r--lib/Net/HTTP/Spore/Role/Middleware.pm44
-rw-r--r--lib/Net/HTTP/Spore/Role/Request.pm82
-rw-r--r--lib/Net/HTTP/Spore/Role/UserAgent.pm22
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;