summary refs log tree commit diff
diff options
context:
space:
mode:
authorfranck cuny <franck@lumberjaph.net>2010-09-15 16:44:57 +0200
committerfranck cuny <franck@lumberjaph.net>2010-09-15 16:44:57 +0200
commit1278125ebaeb8f4f94685176d641f53dbe7855ff (patch)
treea935921b9ef5143261b98b0c53ae41bdbd3e1f95
parentupdate tests (diff)
downloadnet-http-spore-1278125ebaeb8f4f94685176d641f53dbe7855ff.tar.gz
POD
-rw-r--r--lib/Net/HTTP/Spore/Request.pm119
-rw-r--r--lib/Net/HTTP/Spore/Response.pm144
2 files changed, 250 insertions, 13 deletions
diff --git a/lib/Net/HTTP/Spore/Request.pm b/lib/Net/HTTP/Spore/Request.pm
index 908cce7..267ec0b 100644
--- a/lib/Net/HTTP/Spore/Request.pm
+++ b/lib/Net/HTTP/Spore/Request.pm
@@ -1,8 +1,11 @@
 package Net::HTTP::Spore::Request;
 
+# ABSTRACT: Net::HTTP::Spore::Request - Portable HTTP request object from SPORE env hash
+
 use strict;
 use warnings;
 
+use Carp ();
 use URI;
 use HTTP::Headers;
 use HTTP::Request;
@@ -13,18 +16,23 @@ use Net::HTTP::Spore::Response;
 
 sub new {
     my ( $class, $env ) = @_;
+
+    Carp::croak('$env is required') unless defined $env && ref($env) eq 'HASH';
     bless { env => $env }, $class;
 }
 
-sub env         { $_[0]->{env}; }
+sub env         { $_[0]->{env} }
 sub method      { $_[0]->{env}->{REQUEST_METHOD} }
 sub port        { $_[0]->{env}->{SERVER_PORT} }
 sub script_name { $_[0]->{env}->{SCRIPT_NAME} }
-sub path        { $_[0]->{env}->{PATH_INFO} || '/' }
+sub path        { $_[0]->path_info }
 sub request_uri { $_[0]->{env}->{REQUEST_URI} }
-sub protocol    { $_[0]->{env}->{SERVER_PROTOCOL} }
-sub content     { $_[0]->{env}->{'spore.payload'} }
 sub scheme      { $_[0]->{env}->{'spore.scheme'} }
+sub logger      { $_[0]->{env}->{'sporex.logger'} }
+sub secure      { $_[0]->scheme eq 'https' }
+sub content     { $_[0]->{env}->{'spore.payload'} }
+sub body        { $_[0]->{env}->{'spore.payload'} }
+sub input       { $_[0]->{env}->{'spore.payload'} }
 
 sub path_info {
     my $self = shift;
@@ -97,7 +105,7 @@ sub uri {
 
     my $path = URI::Escape::uri_escape($path_info || '', $path_escape_class);
 
-    if ($query_string) {
+    if (defined $query_string) {
         $path .= '?' . $query_string;
     }
 
@@ -105,6 +113,7 @@ sub uri {
     return URI->new( $base . $path )->canonical;
 }
 
+# retourner les query parameters ? vu qu'on a pas encore peuple l'url, on gere comment ?
 sub query_parameters {
     my $self = shift;
 }
@@ -153,3 +162,103 @@ sub finalize {
 }
 
 1;
+
+__END__
+
+=head1 SYNOPSIS
+
+    use Net::HTTP::Spore::Request;
+
+    my $request = Net::HTTP::Spore::Request->new($env);
+
+=head1 DESCRIPTION
+
+Net::HTTP::Spore::Request create a HTTP request
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+    my $req = Net::HTTP::Spore::Request->new();
+
+Creates a new Net::HTTP::Spore::Request object.
+
+=item env
+
+    my $env = $request->env;
+
+Get the environment for the given request
+
+=item method
+
+    my $method = $request->method;
+
+Get the HTTP method for the given request
+
+=item port
+
+    my $port = $request->port;
+
+Get the HTTP port from the URL
+
+=item script_name
+
+    my $script_name = $request->script_name;
+
+Get the script name part from the URL
+
+=item path
+
+=item path_info
+
+    my $path = $request->path_info;
+
+Get the path info part from the URL
+
+=item request_uri
+
+    my $request_uri = $request->request_uri;
+
+Get the request uri from the URL
+
+=item scheme
+
+    my $scheme = $request->scheme;
+
+Get the scheme from the URL
+
+=item secure
+
+    my $secure = $request->secure;
+
+Return true if the URL is HTTPS
+
+=item content
+
+=item body
+
+=item input
+
+    my $input = $request->input;
+
+Get the content that will be posted
+
+=item query_string
+
+=item headers
+
+=item header
+
+=item uri
+
+=item query_parameters
+
+=item base
+
+=item new_response
+
+=item finalize
+
+=back
diff --git a/lib/Net/HTTP/Spore/Response.pm b/lib/Net/HTTP/Spore/Response.pm
index d695dfa..4667e08 100644
--- a/lib/Net/HTTP/Spore/Response.pm
+++ b/lib/Net/HTTP/Spore/Response.pm
@@ -1,5 +1,7 @@
 package Net::HTTP::Spore::Response;
 
+# ABSTRACT: Portable HTTP Response object for SPORE response
+
 use strict;
 use warnings;
 
@@ -11,20 +13,19 @@ sub new {
     my ( $class, $rc, $headers, $body ) = @_;
 
     my $self = bless {}, $class;
+
     $self->status($rc) if defined $rc;
-    if (defined $body) {
-        $self->body($body);
-        $self->raw_body($body);
-    }
-    $self->headers($headers || []);
+    $self->body($body) if defined $body;
+    $self->headers( $headers || [] );
     $self;
 }
 
-sub code    { shift->status(@_) }
-sub content { shift->body(@_) }
-
+sub code           { shift->status(@_) }
+sub content        { shift->body(@_) }
+sub env            { shift->request->env }
 sub content_type   { shift->headers->content_type(@_) }
 sub content_length { shift->headers->content_length(@_) }
+sub location       { shift->header->header( 'Location' => @_ ) }
 
 sub status {
     my $self = shift;
@@ -40,6 +41,9 @@ sub body {
     my $self = shift;
     if (@_) {
         $self->{body} = shift;
+        if ( !defined $self->{raw_body} ) {
+            $self->{raw_body} = $self->{body};
+        }
     }
     else {
         return $self->{body};
@@ -101,3 +105,127 @@ sub finalize {
 }
 
 1;
+__END__
+
+=head1 SYNOPSIS
+
+    use Net:HTTP::Spore::Response;
+
+    my $response = Net::HTTP::Spore::Response->new(
+        200, ['Content-Type', 'application/json'], '{"foo":1}';
+    );
+    $response->request($request);
+
+=head1 DESCRIPTION
+
+Net::HTTP::Spore::Response create a HTTP response
+
+=head1 METHODS
+
+=over 4
+
+=item new
+
+    my $res = Net::HTTP::Spore::Response->new;
+    my $res = Net::HTTP::Spore::Response->new($status);
+    my $res = Net::HTTP::Spore::Response->new($status, $headers);
+    my $res = Net::HTTP::Spore::Response->new($status, $headers, $body);
+
+Creates a new Net::HTTP::Spore::Response object.
+
+=item code
+
+=item status
+
+    $res->status(200);
+    my $status = $res->status;
+
+Gets or sets the HTTP status of the response
+
+=item env
+
+   $res->env($env);
+   my $env = $res->env;
+
+Gets or sets the environment for the response. Shortcut to C<< $res->request->env >>
+
+=item content
+
+=item body
+
+    $res->body($body);
+    my $body = $res->body;
+
+Gets or sets the body for the response
+
+=item raw_body
+
+    my $raw_body = $res->raw_body
+
+The raw_body value is the same as body when the body is sets for the first time.
+
+=item content_type
+
+    $res->content_type('application/json');
+    my $ct = $res->content_type;
+
+Gets or sets the content type of the response body
+
+=item content_length
+
+    $res->content_length(length($body));
+    my $cl = $res->content_length;
+
+Gets or sets the content type of the response body
+
+=item location
+
+    $res->location('http://example.com');
+    my $location = $res->location;
+
+Gets or sets the location header for the response
+
+=item request
+
+    $res->request($request);
+    $request = $res->request;
+
+Gets or sets the HTTP request that created the current HTTP response.
+
+=item headers
+
+    $headers = $res->headers;
+    $res->headers(['Content-Type' => 'application/json']);
+
+Gets or sets HTTP response headers.
+
+=item header
+
+    my $cl = $res->header('Content-Length');
+    $res->header('Content-Type' => 'application/json');
+
+Shortcut for C<< $res->headers->header >>.
+
+=item finalise
+
+    my $res = Net::HTTP::Response->new($status, $headers, $body);
+    say "http status is ".$res->[0];
+
+Return an arrayref:
+
+=over 2
+
+=item status
+
+The first element of the array ref is the HTTP status
+
+=item headers
+
+The second element is an arrayref containing the list of HTTP headers
+
+=item body
+
+The third and final element is the body
+
+=back
+