X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FRequest.pm;h=329254b28a5ae1b76be624e870355437c4e7b31e;hb=b87d834e205e69128e7385f213ab32a7a7bc541f;hp=997b3ba8ac1f222dc06c9836d7a7c7bcfb867827;hpb=7c1c4dc69062bd372f6611c5a2d3e054cf777d79;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index 997b3ba..329254b 100644 --- a/lib/Catalyst/Request.pm +++ b/lib/Catalyst/Request.pm @@ -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 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,40 @@ 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 data_handlers => ( is=>'ro', isa=>'HashRef', default=>sub { +{} } ); + +has body_data => ( + is=>'ro', + lazy=>1, + builder=>'_build_body_data'); + +sub _build_body_data { + my ($self) = @_; + my $content_type = $self->content_type; + my ($match) = grep { $content_type =~/$_/i } + keys(%{$self->data_handlers}); + + if($match) { + my $fh = $self->body; + local $_ = $fh; + return $self->data_handlers->{$match}->($fh, $self); + } else { + return undef; + } +} + # Amount of data to read from input on each pass our $CHUNKSIZE = 64 * 1024; @@ -107,7 +145,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 +163,7 @@ has body_parameters => ( is => 'rw', required => 1, lazy => 1, - default => sub { {} }, + builder => 'prepare_body_parameters', ); has uploads => ( @@ -137,7 +175,8 @@ has uploads => ( has parameters => ( is => 'rw', lazy => 1, - builder => 'prepare_parameters', + builder => '_build_parameters', + clearer => '_clear_parameters', ); # TODO: @@ -150,8 +189,12 @@ 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 +216,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 object body using L - -=cut - has _uploadtmp => ( is => 'ro', predicate => '_has_uploadtmp', @@ -220,30 +251,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 +313,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 +330,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 +346,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 +373,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 +390,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 object). - =head2 $req->address Returns the IP address of the client. @@ -666,7 +672,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. @@ -677,11 +683,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 @@ -690,11 +697,6 @@ actions or regex captures. my @captures = @{ $c->request->captures }; -=head2 $req->snippets - -C 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 +878,50 @@ 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, +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 + +=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 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