summaryrefslogtreecommitdiff
path: root/lib/Net/HTTP/Spore/Role/Request.pm
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/Request.pm
downloadnet-http-spore-3e3dc478fc9b4eb90681df89156dfcc8f7f81481.tar.gz
initial import
Diffstat (limited to 'lib/Net/HTTP/Spore/Role/Request.pm')
-rw-r--r--lib/Net/HTTP/Spore/Role/Request.pm82
1 files changed, 82 insertions, 0 deletions
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