fix body_parameters is undef when no params
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Request.pm
index d1614a3..d2c1c7f 100644 (file)
@@ -15,9 +15,24 @@ use namespace::clean -except => 'meta';
 with 'MooseX::Emulate::Class::Accessor::Fast';
 
 has env => (is => 'ro', writer => '_set_env');
+# XXX Deprecated crap here - warn?
+has action => (is => 'rw');
+# XXX: Deprecated in docs ages ago (2006), deprecated with warning in 5.8000 due
+# to confusion between Engines and Plugin::Authentication. Remove in 5.8100?
+has user => (is => 'rw');
+sub snippets        { shift->captures(@_) }
 
-has _read_position => ( is => 'rw', default => 0 );
-has _read_length => ( is => 'ro',
+has _read_position => (
+    # FIXME: work around Moose bug RT#75367
+    # init_arg => undef,
+    is => 'ro',
+    writer => '_set_read_position',
+    default => 0,
+);
+has _read_length => (
+    # FIXME: work around Moose bug RT#75367
+    # init_arg => undef,
+    is => 'ro',
     default => sub {
         my $self = shift;
         $self->header('Content-Length') || 0;
@@ -25,17 +40,10 @@ has _read_length => ( is => 'ro',
     lazy => 1,
 );
 
-has action => (is => 'rw');
 has address => (is => 'rw');
 has arguments => (is => 'rw', default => sub { [] });
 has cookies => (is => 'ro', builder => 'prepare_cookies', lazy => 1);
 
-=head2 $self->prepare_cookies($c)
-
-Parse cookies from header. Sets a L<CGI::Simple::Cookie> object.
-
-=cut
-
 sub prepare_cookies {
     my ( $self ) = @_;
 
@@ -62,10 +70,6 @@ has headers => (
   lazy => 1,
 );
 
-=head2 $self->prepare_headers($c)
-
-=cut
-
 sub prepare_headers {
     my ($self) = @_;
 
@@ -81,10 +85,10 @@ sub prepare_headers {
     return $headers;
 }
 
-has _context => (
-  is => 'rw',
-  weak_ref => 1,
-  clearer => '_clear_context',
+has _log => (
+    is => 'ro',
+    weak_ref => 1,
+    required => 1,
 );
 
 # Amount of data to read from input on each pass
@@ -107,7 +111,7 @@ sub read {
                         # said there should be.
             return;
         }
-        $self->_read_position( $self->_read_position + $rc );
+        $self->_set_read_position( $self->_read_position + $rc );
         return $buffer;
     }
     else {
@@ -125,7 +129,7 @@ has body_parameters => (
   is => 'rw',
   required => 1,
   lazy => 1,
-  default => sub { {} },
+  builder => 'prepare_body_parameters',
 );
 
 has uploads => (
@@ -150,8 +154,6 @@ has parameters => (
 
 sub prepare_parameters {
     my ( $self ) = @_;
-
-    $self->prepare_body;
     my $parameters = {};
     my $body_parameters = $self->body_parameters;
     my $query_parameters = $self->query_parameters;
@@ -173,18 +175,6 @@ sub prepare_parameters {
     $parameters;
 }
 
-before body_parameters => sub {
-    my ($self) = @_;
-    $self->prepare_body;
-    $self->prepare_body_parameters;
-};
-
-=head2 $self->prepare_body()
-
-sets up the L<Catalyst::Request> object body using L<HTTP::Body>
-
-=cut
-
 has _uploadtmp => (
     is => 'ro',
     predicate => '_has_uploadtmp',
@@ -220,30 +210,19 @@ sub prepare_body {
     }
 }
 
-=head2 $self->prepare_body_chunk()
-
-Add a chunk to the request body.
-
-=cut
-
 sub prepare_body_chunk {
     my ( $self, $chunk ) = @_;
 
     $self->_body->add($chunk);
 }
 
-=head2 $self->prepare_body_parameters()
-
-Sets up parameters from body.
-
-=cut
-
 sub prepare_body_parameters {
     my ( $self ) = @_;
 
-    return unless $self->_body;
+    $self->prepare_body if ! $self->_has_body;
+    return {} unless $self->_body;
 
-    $self->{body_parameters} = $self->_body->param; # FIXME!! Recursion here.
+    return $self->_body->param;
 }
 
 sub prepare_connection {
@@ -265,7 +244,7 @@ around parameters => sub {
     my ($orig, $self, $params) = @_;
     if ($params) {
         if ( !ref $params ) {
-            $self->_context->log->warn(
+            $self->_log->warn(
                 "Attempt to retrieve '$params' with req->params(), " .
                 "you probably meant to call req->param('$params')"
             );
@@ -293,7 +272,7 @@ has _body => (
 #             and provide a custom reader..
 sub body {
   my $self = shift;
-  $self->prepare_body();
+  $self->prepare_body unless ! $self->_has_body;
   croak 'body is a reader' if scalar @_;
   return blessed $self->_body ? $self->_body->body : $self->_body;
 }
@@ -310,17 +289,12 @@ has hostname => (
 
 has _path => ( is => 'rw', predicate => '_has_path', clearer => '_clear_path' );
 
-# XXX: Deprecated in docs ages ago (2006), deprecated with warning in 5.8000 due
-# to confusion between Engines and Plugin::Authentication. Remove in 5.8100?
-has user => (is => 'rw');
-
 sub args            { shift->arguments(@_) }
 sub body_params     { shift->body_parameters(@_) }
 sub input           { shift->body(@_) }
 sub params          { shift->parameters(@_) }
 sub query_params    { shift->query_parameters(@_) }
 sub path_info       { shift->path(@_) }
-sub snippets        { shift->captures(@_) }
 
 =for stopwords param params
 
@@ -331,8 +305,7 @@ Catalyst::Request - provides information about the current client request
 =head1 SYNOPSIS
 
     $req = $c->request;
-    $req->action;
-    $req->address;
+    $req->address eq "127.0.0.1";
     $req->arguments;
     $req->args;
     $req->base;
@@ -359,7 +332,7 @@ Catalyst::Request - provides information about the current client request
     $req->read;
     $req->referer;
     $req->secure;
-    $req->captures; # previously knows as snippets
+    $req->captures;
     $req->upload;
     $req->uploads;
     $req->uri;
@@ -376,14 +349,6 @@ thus hiding the details of the particular engine implementation.
 
 =head1 METHODS
 
-=head2 $req->action
-
-[DEPRECATED] Returns the name of the requested action.
-
-
-Use C<< $c->action >> instead (which returns a
-L<Catalyst::Action|Catalyst::Action> object).
-
 =head2 $req->address
 
 Returns the IP address of the client.
@@ -679,9 +644,8 @@ Shortcut for $req->headers->referer. Returns the referring page.
 Returns true or false, indicating whether the connection is secure
 (https). Note that the URI scheme (e.g., http vs. https) must be determined
 through heuristics, and therefore the reliability of $req->secure will depend
-on your server configuration. If you are serving secure pages on the standard
-SSL port (443) and/or setting the HTTPS environment variable, $req->secure
-should be valid.
+on your server configuration. If you are setting the HTTPS environment variable, 
+$req->secure should be valid.
 
 =head2 $req->captures
 
@@ -690,11 +654,6 @@ actions or regex captures.
 
     my @captures = @{ $c->request->captures };
 
-=head2 $req->snippets
-
-C<captures> used to be called snippets. This is still available for backwards
-compatibility, but is considered deprecated.
-
 =head2 $req->upload
 
 A convenient method to access $req->uploads.
@@ -876,6 +835,43 @@ Returns the value of the C<REMOTE_USER> environment variable.
 Shortcut to $req->headers->user_agent. Returns the user agent (browser)
 version string.
 
+=head1 SETUP METHODS
+
+You should never need to call these yourself in application code,
+however they are useful if extending Catalyst by applying a request role.
+
+=head2 $self->prepare_headers()
+
+Sets up the C<< $res->headers >> accessor.
+
+=head2 $self->prepare_body()
+
+Sets up the body using L<HTTP::Body>
+
+=head2 $self->prepare_body_chunk()
+
+Add a chunk to the request body.
+
+=head2 $self->prepare_body_parameters()
+
+Sets up parameters from body.
+
+=head2 $self->prepare_cookies()
+
+Parse cookies from header. Sets up a L<CGI::Simple::Cookie> object.
+
+=head2 $self->prepare_connection()
+
+Sets up various fields in the request like the local and remote addresses,
+request method, hostname requested etc.
+
+=head2 $self->prepare_parameters()
+
+Ensures that the body has been parsed, then builds the parameters, which are
+combined from those in the request and those in the body.
+
+This method is the builder for the 'parameters' attribute.
+
 =head2 meta
 
 Provided by Moose