summary refs log tree commit diff
path: root/lib/Net/HTTP/Spore/Middleware
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/Middleware
downloadnet-http-spore-3e3dc478fc9b4eb90681df89156dfcc8f7f81481.tar.gz
initial import
Diffstat (limited to 'lib/Net/HTTP/Spore/Middleware')
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Auth/Basic.pm24
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Auth/OAuth.pm37
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Format.pm37
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Format/Auto.pm17
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Format/JSON.pm19
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Format/XML.pm13
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Format/YAML.pm12
-rw-r--r--lib/Net/HTTP/Spore/Middleware/LogDispatch.pm7
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Runtime.pm22
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Test.pm12
-rw-r--r--lib/Net/HTTP/Spore/Middleware/Test/Response.pm28
-rw-r--r--lib/Net/HTTP/Spore/Middleware/UserAgent.pm15
12 files changed, 243 insertions, 0 deletions
diff --git a/lib/Net/HTTP/Spore/Middleware/Auth/Basic.pm b/lib/Net/HTTP/Spore/Middleware/Auth/Basic.pm
new file mode 100644
index 0000000..18c1e16
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Auth/Basic.pm
@@ -0,0 +1,24 @@
+package Net::HTTP::Spore::Middleware::Auth::Basic;
+
+use Moose;
+use MIME::Base64;
+
+extends 'Net::HTTP::Spore::Middleware';
+
+has username => (isa => 'Str', is => 'rw', predicate => 'has_username');
+has password => (isa => 'Str', is => 'rw', predicate => 'has_password');
+
+sub call {
+    my ( $self, $req ) = @_;
+
+    if ( $self->has_username && $self->has_password ) {
+        $req->header(
+            'Authorization' => 'Basic '
+              . MIME::Base64::encode(
+                $self->username . ':' . $self->password, ''
+              )
+        );
+    }
+}
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Auth/OAuth.pm b/lib/Net/HTTP/Spore/Middleware/Auth/OAuth.pm
new file mode 100644
index 0000000..e30a45b
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Auth/OAuth.pm
@@ -0,0 +1,37 @@
+package Net::HTTP::Spore::Middleware::Auth::OAuth;
+
+use Moose;
+extends 'Net::HTTP::Spore::Middleware';
+
+use Net::OAuth;
+use MIME::Base64;
+
+has [qw/consumer_key consumer_secret token token_secret/] => (
+    is       => 'ro',
+    isa      => 'Str',
+    required => 1,
+);
+
+sub call {
+    my ( $self, $req ) = @_;
+
+    my $request = Net::OAuth->request('protected resource')->new(
+        version          => '1.0',
+        consumer_key     => $self->consumer_key,
+        consumer_secret  => $self->consumer_secret,
+        token            => $self->token,
+        token_secret     => $self->token_secret,
+        request_method   => $req->method,
+        signature_method => 'HMAC-SHA1',
+        timestamp        => time,
+        nonce            => MIME::Base64::encode( time . $$ . rand ),
+        request_url      => $req->uri,
+        # extra_params     => \%post_args,
+    );
+
+    $request->sign;
+    my $auth = $request->to_authorization_header;
+    $req->header( 'Authorization' => $auth );
+}
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Format.pm b/lib/Net/HTTP/Spore/Middleware/Format.pm
new file mode 100644
index 0000000..7acd376
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Format.pm
@@ -0,0 +1,37 @@
+package Net::HTTP::Spore::Middleware::Format;
+
+use Moose;
+extends 'Net::HTTP::Spore::Middleware';
+
+sub encode       { die "must be implemented" }
+sub decode       { die "must be implemented" }
+sub accept_type  { die "must be implemented" }
+sub content_type { die "must be implemented" }
+
+sub call {
+    my ( $self, $req ) = @_;
+
+    return
+      if ( exists $req->env->{'sporex.format'}
+        && $req->env->{'sporex.format'} == 1 );
+
+    $req->header( $self->accept_type );
+
+    if ( $req->env->{'spore.payload'} ) {
+        $req->env->{'spore.payload'} =
+          $self->encode( $req->env->{'spore.payload'} );
+        $req->header( $self->content_type );
+    }
+
+    $req->env->{'sporex.format'} = 1;
+
+    return $self->response_cb(
+        sub {
+            my $res     = shift;
+            my $content = $self->decode( $res->body );
+            $res->body($content);
+        }
+    );
+}
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Format/Auto.pm b/lib/Net/HTTP/Spore/Middleware/Format/Auto.pm
new file mode 100644
index 0000000..fd66b8c
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Format/Auto.pm
@@ -0,0 +1,17 @@
+package Net::HTTP::Spore::Middleware::Format::Auto;
+
+use Moose;
+extends 'Net::HTTP::Spore::Middleware::Format';
+
+sub call {
+    my ( $self, $req ) = @_;
+
+    $req->env->{'sporex.format'} = 1;
+
+    return $self->response_cb( sub {
+        my $res = shift;
+        return $res;
+    });
+}
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Format/JSON.pm b/lib/Net/HTTP/Spore/Middleware/Format/JSON.pm
new file mode 100644
index 0000000..61326cd
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Format/JSON.pm
@@ -0,0 +1,19 @@
+package Net::HTTP::Spore::Middleware::Format::JSON;
+
+use JSON;
+use Moose;
+extends 'Net::HTTP::Spore::Middleware::Format';
+
+has _json_parser => (
+    is      => 'rw',
+    isa     => 'JSON',
+    lazy    => 1,
+    default => sub { JSON->new->allow_nonref },
+);
+
+sub encode       { $_[0]->_json_parser->encode( $_[1] ); }
+sub decode       { $_[0]->_json_parser->decode( $_[1] ); }
+sub accept_type  { ( 'Accept' => 'application/json' ) }
+sub content_type { ( 'Content-Type' => 'application/json' ) }
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Format/XML.pm b/lib/Net/HTTP/Spore/Middleware/Format/XML.pm
new file mode 100644
index 0000000..c4ae038
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Format/XML.pm
@@ -0,0 +1,13 @@
+package Net::HTTP::Spore::Middleware::Format::XML;
+
+use Moose;
+extends 'Net::HTTP::Spore::Middleware::Format';
+
+use XML::Simple;
+
+sub accept_type  { ( 'Accept'       => 'text/xml' ); }
+sub content_type { ( 'Content-Type' => 'text/xml' ) }
+sub encode       { XMLout( $_[1] ) }
+sub decode       { XMLin( $_[1] ) }
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Format/YAML.pm b/lib/Net/HTTP/Spore/Middleware/Format/YAML.pm
new file mode 100644
index 0000000..bd844ce
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Format/YAML.pm
@@ -0,0 +1,12 @@
+package Net::HTTP::Spore::Middleware::Format::YAML;
+
+use YAML;
+use Moose;
+extends 'Net::HTTP::Spore::Middleware::Format';
+
+sub encode       { YAML::Decode( $_[1] ); }
+sub decode       { YAML::Load( $_[1] ); }
+sub accept_type  { ( 'Accept' => 'text/x-yaml' ) }
+sub content_type { ( 'Content-Type' => 'text/x-yaml' ) }
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/LogDispatch.pm b/lib/Net/HTTP/Spore/Middleware/LogDispatch.pm
new file mode 100644
index 0000000..2724fcf
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/LogDispatch.pm
@@ -0,0 +1,7 @@
+package Net::HTTP::Spore::Middleware::LogDispatch;
+
+use Moose;
+extends 'Net::HTTP::Spore::Middleware';
+
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Runtime.pm b/lib/Net/HTTP/Spore/Middleware/Runtime.pm
new file mode 100644
index 0000000..1614c31
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Runtime.pm
@@ -0,0 +1,22 @@
+package Net::HTTP::Spore::Middleware::Runtime;
+
+use Moose;
+extends 'Net::HTTP::Spore::Middleware';
+use Time::HiRes;
+
+sub call {
+    my ( $self, $req) = @_;
+
+    my $start_time = [Time::HiRes::gettimeofday];
+
+    $self->response_cb(
+        sub {
+            my $res = shift;
+            my $req_time = sprintf '%.6f',
+              Time::HiRes::tv_interval($start_time);
+            $res->header('X-Spore-Runtime' => $req_time);
+        }
+    );
+}
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Test.pm b/lib/Net/HTTP/Spore/Middleware/Test.pm
new file mode 100644
index 0000000..6cf2c9e
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Test.pm
@@ -0,0 +1,12 @@
+package Net::HTTP::Spore::Middleware::Test;
+
+use strict;
+use warnings;
+
+use parent qw/Net::HTTP::Spore::Middleware/;
+
+sub call {
+#    use YAML::Syck; warn Dump \@_;
+}
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/Test/Response.pm b/lib/Net/HTTP/Spore/Middleware/Test/Response.pm
new file mode 100644
index 0000000..ca216c5
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/Test/Response.pm
@@ -0,0 +1,28 @@
+package Net::HTTP::Spore::Middleware::Test::Response;
+
+use Moose;
+extends 'Net::HTTP::Spore::Middleware';
+
+has status => ( isa => 'Int', is => 'ro', lazy => 1, default => 200 );
+has headers => ( isa => 'ArrayRef', is => 'ro', default => sub { [] } );
+has callback => (
+    isa     => 'CodeRef',
+    is      => 'ro',
+    lazy    => 1,
+    default => sub {
+        sub {
+            my ( $self, $req ) = @_;
+            $req->new_response( $self->status, $self->headers, $self->body, );
+        }
+    }
+);
+
+has body =>
+  ( isa => 'HashRef', is => 'ro', lazy => 1, default => sub { { foo => 1 } } );
+
+sub call {
+    my ( $self, $req ) = @_;
+    $self->callback->($self, $req);
+}
+
+1;
diff --git a/lib/Net/HTTP/Spore/Middleware/UserAgent.pm b/lib/Net/HTTP/Spore/Middleware/UserAgent.pm
new file mode 100644
index 0000000..0517c26
--- /dev/null
+++ b/lib/Net/HTTP/Spore/Middleware/UserAgent.pm
@@ -0,0 +1,15 @@
+package Net::HTTP::Spore::Middleware::UserAgent;
+
+use Moose;
+extends qw/Net::HTTP::Spore::Middleware/;
+
+has useragent => (is => 'ro', isa => 'Str', required => 1);
+
+sub call {
+    my ($self, $req) = @_;
+
+    $req->header('User-Agent' => $self->useragent);
+}
+
+
+1;