X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FRequest.pm;h=f75319b699f23a5e2f9cd327ec80136f217ca88a;hp=3c9dee1b0dd125218223b21b747eda84e186a44c;hb=dd5b1dc47018c241cafda7f2b565d6a39257a1bf;hpb=47b9d68e304e9cb305974bc15aa8e60f4bfb6c45 diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index 3c9dee1..f75319b 100644 --- a/lib/Catalyst/Request.pm +++ b/lib/Catalyst/Request.pm @@ -23,13 +23,15 @@ has user => (is => 'rw'); sub snippets { shift->captures(@_) } has _read_position => ( - init_arg => undef, + # FIXME: work around Moose bug RT#75367 + # init_arg => undef, is => 'ro', writer => '_set_read_position', default => 0, ); has _read_length => ( - init_arg => undef, + # FIXME: work around Moose bug RT#75367 + # init_arg => undef, is => 'ro', default => sub { my $self = shift; @@ -89,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; @@ -127,7 +152,7 @@ has body_parameters => ( is => 'rw', required => 1, lazy => 1, - default => sub { {} }, + builder => 'prepare_body_parameters', ); has uploads => ( @@ -139,7 +164,8 @@ has uploads => ( has parameters => ( is => 'rw', lazy => 1, - builder => 'prepare_parameters', + builder => '_build_parameters', + clearer => '_clear_parameters', ); # TODO: @@ -152,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; @@ -175,12 +207,6 @@ sub prepare_parameters { $parameters; } -before body_parameters => sub { - my ($self) = @_; - $self->prepare_body; - $self->prepare_body_parameters; -}; - has _uploadtmp => ( is => 'ro', predicate => '_has_uploadtmp', @@ -225,9 +251,10 @@ sub prepare_body_chunk { 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 { @@ -277,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; } @@ -301,7 +328,7 @@ sub params { shift->parameters(@_) } sub query_params { shift->query_parameters(@_) } sub path_info { shift->path(@_) } -=for stopwords param params snippets +=for stopwords param params =head1 NAME @@ -636,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. @@ -647,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 @@ -841,6 +869,12 @@ Returns the value of the C 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, @@ -862,10 +896,23 @@ Add a chunk to the request body. Sets up parameters from body. -=head2 $self->prepare_cookies($c) +=head2 $self->prepare_cookies() Parse cookies from header. Sets up a L 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