summary refs log tree commit diff
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;