get metaclass using preferred mechanism, via Moose
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Request.pm
index 442f888..f75319b 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'); # XXX Deprecated - warn?
 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) = @_;
 
@@ -87,6 +91,29 @@ has _log => (
     required => 1,
 );
 
+has io_fh => (
+  is=>'ro',
+  predicate=>'has_io_fh',
+  lazy=>1,
+  builder=>'_build_io_fh');
+
+sub _build_io_fh {
+    my $self = shift;
+    return $self->env->{'psgix.io'}
+      || die "Your Server does not support psgix.io";
+};
+
+has body_fh => (
+  is=>'ro',
+  predicate=>'has_body_fh',
+  lazy=>1,
+  builder=>'_build_body_fh');
+
+sub _build_body_fh {
+    (my $input_fh = shift->env->{'psgi.input'})->seek(0, 0);
+    return $input_fh;
+};
+
 # Amount of data to read from input on each pass
 our $CHUNKSIZE = 64 * 1024;
 
@@ -107,7 +134,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 +152,7 @@ has body_parameters => (
   is => 'rw',
   required => 1,
   lazy => 1,
-  default => sub { {} },
+  builder => 'prepare_body_parameters',
 );
 
 has uploads => (
@@ -137,7 +164,8 @@ has uploads => (
 has parameters => (
     is => 'rw',
     lazy => 1,
-    builder => 'prepare_parameters',
+    builder => '_build_parameters',
+    clearer => '_clear_parameters',
 );
 
 # TODO:
@@ -150,8 +178,14 @@ has parameters => (
 
 sub prepare_parameters {
     my ( $self ) = @_;
+    $self->_clear_parameters;
+    return $self->parameters;
+}
+
+
 
-    $self->prepare_body;
+sub _build_parameters {
+    my ( $self ) = @_;
     my $parameters = {};
     my $body_parameters = $self->body_parameters;
     my $query_parameters = $self->query_parameters;
@@ -173,18 +207,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 +242,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 {
@@ -293,7 +304,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 +321,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
 
@@ -358,7 +364,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;
@@ -657,7 +663,7 @@ defaults to the size of the request if not specified.
 
 =head2 $req->read_chunk(\$buff, $max)
 
-Reads a chunk..
+Reads a chunk.
 
 You have to set MyApp->config(parse_on_demand => 1) to use this directly.
 
@@ -668,11 +674,12 @@ Shortcut for $req->headers->referer. Returns the referring page.
 =head2 $req->secure
 
 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.
+(https). The reliability of $req->secure may depend on your server
+configuration; Catalyst relies on PSGI to determine whether or not a
+request is secure (Catalyst looks at psgi.url_scheme), and different
+PSGI servers may make this determination in different ways (as by
+directly passing along information from the server, interpreting any of
+several HTTP headers, or using heuristics of their own).
 
 =head2 $req->captures
 
@@ -681,11 +688,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.
@@ -867,6 +869,50 @@ Returns the value of the C<REMOTE_USER> environment variable.
 Shortcut to $req->headers->user_agent. Returns the user agent (browser)
 version string.
 
+=head2 $req->io_fh
+
+Returns a psgix.io bidirectional socket, if your server supports one.  Used for
+when you want to jailbreak out of PSGI and handle bidirectional client server
+communication manually, such as when you are using cometd or websockets.
+
+=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.
+
+If parameters have already been set will clear the parameters and build them again.
+
+
 =head2 meta
 
 Provided by Moose