1 package Catalyst::Request;
3 use IO::Socket qw[AF_INET inet_aton];
13 use namespace::clean -except => 'meta';
15 with 'MooseX::Emulate::Class::Accessor::Fast';
17 has env => (is => 'ro', writer => '_set_env');
19 has _read_position => ( is => 'rw', default => 0 );
20 has _read_length => ( is => 'ro',
23 $self->header('Content-Length') || 0;
28 has action => (is => 'rw');
29 has address => (is => 'rw');
30 has arguments => (is => 'rw', default => sub { [] });
31 has cookies => (is => 'rw', default => sub { {} });
32 has query_keywords => (is => 'rw');
33 has match => (is => 'rw');
34 has method => (is => 'rw');
35 has protocol => (is => 'rw');
36 has query_parameters => (is => 'rw', default => sub { {} });
37 has secure => (is => 'rw', default => 0);
38 has captures => (is => 'rw', default => sub { [] });
39 has uri => (is => 'rw', predicate => 'has_uri');
40 has remote_user => (is => 'rw');
43 isa => 'HTTP::Headers',
44 handles => [qw(content_encoding content_length content_type header referer user_agent)],
45 default => sub { HTTP::Headers->new() },
53 clearer => '_clear_context',
56 # Amount of data to read from input on each pass
57 our $CHUNKSIZE = 64 * 1024;
60 my ($self, $maxlength) = @_;
61 my $remaining = $self->_read_length - $self->_read_position;
62 $maxlength ||= $CHUNKSIZE;
64 # Are we done reading?
65 if ( $remaining <= 0 ) {
69 my $readlen = ( $remaining > $maxlength ) ? $maxlength : $remaining;
70 my $rc = $self->read_chunk( my $buffer, $readlen );
72 if (0 == $rc) { # Nothing more to read even though Content-Length
73 # said there should be.
76 $self->_read_position( $self->_read_position + $rc );
80 Catalyst::Exception->throw(
81 message => "Unknown error reading input: $!" );
87 return $self->env->{'psgi.input'}->read(@_);
90 has body_parameters => (
94 default => sub { {} },
100 default => sub { {} },
107 default => sub { {} },
108 predicate => '_has_prepared_parameters',
112 # - Can we lose the before modifiers which just call prepare_body ?
113 # they are wasteful, slow us down and feel cluttery.
115 # Can we make _body an attribute, have the rest of
116 # these lazy build from there and kill all the direct hash access
117 # in Catalyst.pm and Engine.pm?
119 before parameters => sub {
122 $self->_context->engine->prepare_parameters($self->_context);
124 before body_parameters => sub {
127 $self->prepare_body_parameters;
130 =head2 $self->prepare_body()
132 sets up the L<Catalyst::Request> object body using L<HTTP::Body>
138 predicate => '_has_uploadtmp',
144 if ( my $length = $self->_read_length ) {
145 unless ( $self->_body ) {
146 my $type = $self->header('Content-Type');
147 $self->_body(HTTP::Body->new( $type, $length ));
148 $self->_body->cleanup(1); # Make extra sure!
149 $self->_body->tmpdir( $self->_uploadtmp )
150 if $self->_has_uploadtmp;
153 # Check for definedness as you could read '0'
154 while ( defined ( my $buffer = $self->read() ) ) {
155 $self->prepare_body_chunk($buffer);
158 # paranoia against wrong Content-Length header
159 my $remaining = $length - $self->_read_position;
160 if ( $remaining > 0 ) {
161 Catalyst::Exception->throw(
162 "Wrong Content-Length value: $length" );
166 # Defined but will cause all body code to be skipped
171 =head2 $self->prepare_body_chunk()
173 Add a chunk to the request body.
177 sub prepare_body_chunk {
178 my ( $self, $chunk ) = @_;
180 $self->_body->add($chunk);
183 =head2 $self->prepare_body_parameters()
185 Sets up parameters from body.
189 sub prepare_body_parameters {
192 return unless $self->_body;
194 $self->{body_parameters} = $self->_body->param; # FIXME!! Recursion here.
197 around parameters => sub {
198 my ($orig, $self, $params) = @_;
200 if ( !ref $params ) {
201 $self->_context->log->warn(
202 "Attempt to retrieve '$params' with req->params(), " .
203 "you probably meant to call req->param('$params')"
207 return $self->$orig($params);
218 return $self->path if $self->has_uri;
223 is => 'rw', clearer => '_clear_body', predicate => '_has_body',
225 # Eugh, ugly. Should just be able to rename accessor methods to 'body'
226 # and provide a custom reader..
229 $self->prepare_body();
230 croak 'body is a reader' if scalar @_;
231 return blessed $self->_body ? $self->_body->body : $self->_body;
240 gethostbyaddr( inet_aton( $self->address ), AF_INET ) || $self->address
244 has _path => ( is => 'rw', predicate => '_has_path', clearer => '_clear_path' );
246 # XXX: Deprecated in docs ages ago (2006), deprecated with warning in 5.8000 due
247 # to confusion between Engines and Plugin::Authentication. Remove in 5.8100?
248 has user => (is => 'rw');
250 sub args { shift->arguments(@_) }
251 sub body_params { shift->body_parameters(@_) }
252 sub input { shift->body(@_) }
253 sub params { shift->parameters(@_) }
254 sub query_params { shift->query_parameters(@_) }
255 sub path_info { shift->path(@_) }
256 sub snippets { shift->captures(@_) }
258 =for stopwords param params
262 Catalyst::Request - provides information about the current client request
273 $req->body_parameters;
274 $req->content_encoding;
275 $req->content_length;
283 $req->query_keywords;
291 $req->query_parameters;
295 $req->captures; # previously knows as snippets
302 See also L<Catalyst>, L<Catalyst::Request::Upload>.
306 This is the Catalyst Request class, which provides an interface to data for the
307 current client request. The request object is prepared by L<Catalyst::Engine>,
308 thus hiding the details of the particular engine implementation.
314 [DEPRECATED] Returns the name of the requested action.
317 Use C<< $c->action >> instead (which returns a
318 L<Catalyst::Action|Catalyst::Action> object).
322 Returns the IP address of the client.
324 =head2 $req->arguments
326 Returns a reference to an array containing the arguments.
328 print $c->request->arguments->[0];
330 For example, if your action was
332 package MyApp::Controller::Foo;
338 and the URI for the request was C<http://.../foo/moose/bah>, the string C<bah>
339 would be the first and only argument.
341 Arguments get automatically URI-unescaped for you.
345 Shortcut for L</arguments>.
349 Contains the URI base. This will always have a trailing slash. Note that the
350 URI scheme (e.g., http vs. https) must be determined through heuristics;
351 depending on your server configuration, it may be incorrect. See $req->secure
354 If your application was queried with the URI
355 C<http://localhost:3000/some/path> then C<base> is C<http://localhost:3000/>.
359 Returns the message body of the request, as returned by L<HTTP::Body>: a string,
360 unless Content-Type is C<application/x-www-form-urlencoded>, C<text/xml>, or
361 C<multipart/form-data>, in which case a L<File::Temp> object is returned.
363 =head2 $req->body_parameters
365 Returns a reference to a hash containing body (POST) parameters. Values can
366 be either a scalar or an arrayref containing scalars.
368 print $c->request->body_parameters->{field};
369 print $c->request->body_parameters->{field}->[0];
371 These are the parameters from the POST part of the request, if any.
373 =head2 $req->body_params
375 Shortcut for body_parameters.
377 =head2 $req->content_encoding
379 Shortcut for $req->headers->content_encoding.
381 =head2 $req->content_length
383 Shortcut for $req->headers->content_length.
385 =head2 $req->content_type
387 Shortcut for $req->headers->content_type.
391 A convenient method to access $req->cookies.
393 $cookie = $c->request->cookie('name');
394 @cookies = $c->request->cookie;
402 return keys %{ $self->cookies };
409 unless ( exists $self->cookies->{$name} ) {
413 return $self->cookies->{$name};
419 Returns a reference to a hash containing the cookies.
421 print $c->request->cookies->{mycookie}->value;
423 The cookies in the hash are indexed by name, and the values are L<CGI::Simple::Cookie>
428 Shortcut for $req->headers->header.
432 Returns an L<HTTP::Headers> object containing the headers for the current request.
434 print $c->request->headers->header('X-Catalyst');
436 =head2 $req->hostname
438 Returns the hostname of the client. Use C<< $req->uri->host >> to get the hostname of the server.
442 Alias for $req->body.
444 =head2 $req->query_keywords
446 Contains the keywords portion of a query string, when no '=' signs are
449 http://localhost/path?some+keywords
451 $c->request->query_keywords will contain 'some keywords'
455 This contains the matching part of a Regex action. Otherwise
456 it returns the same as 'action', except for default actions,
457 which return an empty string.
461 Contains the request method (C<GET>, C<POST>, C<HEAD>, etc).
465 Returns GET and POST parameters with a CGI.pm-compatible param method. This
466 is an alternative method for accessing parameters in $c->req->parameters.
468 $value = $c->request->param( 'foo' );
469 @values = $c->request->param( 'foo' );
470 @params = $c->request->param;
472 Like L<CGI>, and B<unlike> earlier versions of Catalyst, passing multiple
473 arguments to this method, like this:
475 $c->request->param( 'foo', 'bar', 'gorch', 'quxx' );
477 will set the parameter C<foo> to the multiple values C<bar>, C<gorch> and
478 C<quxx>. Previously this would have added C<bar> as another value to C<foo>
479 (creating it if it didn't exist before), and C<quxx> as another value for
482 B<NOTE> this is considered a legacy interface and care should be taken when
483 using it. C<< scalar $c->req->param( 'foo' ) >> will return only the first
484 C<foo> param even if multiple are present; C<< $c->req->param( 'foo' ) >> will
485 return a list of as many are present, which can have unexpected consequences
486 when writing code of the form:
490 baz => $c->req->param( 'baz' ),
493 If multiple C<baz> parameters are provided this code might corrupt data or
494 cause a hash initialization error. For a more straightforward interface see
495 C<< $c->req->parameters >>.
503 return keys %{ $self->parameters };
510 unless ( exists $self->parameters->{$param} ) {
511 return wantarray ? () : undef;
514 if ( ref $self->parameters->{$param} eq 'ARRAY' ) {
516 ? @{ $self->parameters->{$param} }
517 : $self->parameters->{$param}->[0];
521 ? ( $self->parameters->{$param} )
522 : $self->parameters->{$param};
527 $self->parameters->{$field} = [@_];
531 =head2 $req->parameters
533 Returns a reference to a hash containing GET and POST parameters. Values can
534 be either a scalar or an arrayref containing scalars.
536 print $c->request->parameters->{field};
537 print $c->request->parameters->{field}->[0];
539 This is the combination of C<query_parameters> and C<body_parameters>.
543 Shortcut for $req->parameters.
547 Returns the path, i.e. the part of the URI after $req->base, for the current request.
549 http://localhost/path/foo
551 $c->request->path will contain 'path/foo'
553 =head2 $req->path_info
555 Alias for path, added for compatibility with L<CGI>.
560 my ( $self, @params ) = @_;
563 $self->uri->path(@params);
566 elsif ( $self->_has_path ) {
570 my $path = $self->uri->path;
571 my $location = $self->base->path;
572 $path =~ s/^(\Q$location\E)?//;
580 =head2 $req->protocol
582 Returns the protocol (HTTP/1.0 or HTTP/1.1) used for the current request.
584 =head2 $req->query_parameters
586 =head2 $req->query_params
588 Returns a reference to a hash containing query string (GET) parameters. Values can
589 be either a scalar or an arrayref containing scalars.
591 print $c->request->query_parameters->{field};
592 print $c->request->query_parameters->{field}->[0];
594 =head2 $req->read( [$maxlength] )
596 Reads a chunk of data from the request body. This method is intended to be
597 used in a while loop, reading $maxlength bytes on every call. $maxlength
598 defaults to the size of the request if not specified.
600 =head2 $req->read_chunk(\$buff, $max)
604 You have to set MyApp->config(parse_on_demand => 1) to use this directly.
608 Shortcut for $req->headers->referer. Returns the referring page.
612 Returns true or false, indicating whether the connection is secure
613 (https). Note that the URI scheme (e.g., http vs. https) must be determined
614 through heuristics, and therefore the reliability of $req->secure will depend
615 on your server configuration. If you are serving secure pages on the standard
616 SSL port (443) and/or setting the HTTPS environment variable, $req->secure
619 =head2 $req->captures
621 Returns a reference to an array containing captured args from chained
622 actions or regex captures.
624 my @captures = @{ $c->request->captures };
626 =head2 $req->snippets
628 C<captures> used to be called snippets. This is still available for backwards
629 compatibility, but is considered deprecated.
633 A convenient method to access $req->uploads.
635 $upload = $c->request->upload('field');
636 @uploads = $c->request->upload('field');
637 @fields = $c->request->upload;
639 for my $upload ( $c->request->upload('field') ) {
640 print $upload->filename;
649 return keys %{ $self->uploads };
656 unless ( exists $self->uploads->{$upload} ) {
657 return wantarray ? () : undef;
660 if ( ref $self->uploads->{$upload} eq 'ARRAY' ) {
662 ? @{ $self->uploads->{$upload} }
663 : $self->uploads->{$upload}->[0];
667 ? ( $self->uploads->{$upload} )
668 : $self->uploads->{$upload};
674 while ( my ( $field, $upload ) = splice( @_, 0, 2 ) ) {
676 if ( exists $self->uploads->{$field} ) {
677 for ( $self->uploads->{$field} ) {
678 $_ = [$_] unless ref($_) eq "ARRAY";
679 push( @$_, $upload );
683 $self->uploads->{$field} = $upload;
691 Returns a reference to a hash containing uploads. Values can be either a
692 L<Catalyst::Request::Upload> object, or an arrayref of
693 L<Catalyst::Request::Upload> objects.
695 my $upload = $c->request->uploads->{field};
696 my $upload = $c->request->uploads->{field}->[0];
700 Returns a L<URI> object for the current request. Stringifies to the URI text.
702 =head2 $req->mangle_params( { key => 'value' }, $appendmode);
704 Returns a hashref of parameters stemming from the current request's params,
705 plus the ones supplied. Keys for which no current param exists will be
706 added, keys with undefined values will be removed and keys with existing
707 params will be replaced. Note that you can supply a true value as the final
708 argument to change behavior with regards to existing parameters, appending
709 values rather than replacing them.
713 # URI query params foo=1
714 my $hashref = $req->mangle_params({ foo => 2 });
715 # Result is query params of foo=2
719 # URI query params foo=1
720 my $hashref = $req->mangle_params({ foo => 2 }, 1);
721 # Result is query params of foo=1&foo=2
723 This is the code behind C<uri_with>.
728 my ($self, $args, $append) = @_;
730 carp('No arguments passed to mangle_params()') unless $args;
732 foreach my $value ( values %$args ) {
733 next unless defined $value;
734 for ( ref $value eq 'ARRAY' ? @$value : $value ) {
736 utf8::encode( $_ ) if utf8::is_utf8($_);
740 my %params = %{ $self->uri->query_form_hash };
741 foreach my $key (keys %{ $args }) {
742 my $val = $args->{$key};
745 if($append && exists($params{$key})) {
747 # This little bit of heaven handles appending a new value onto
748 # an existing one regardless if the existing value is an array
749 # or not, and regardless if the new value is an array or not
751 ref($params{$key}) eq 'ARRAY' ? @{ $params{$key} } : $params{$key},
752 ref($val) eq 'ARRAY' ? @{ $val } : $val
756 $params{$key} = $val;
760 # If the param wasn't defined then we delete it.
761 delete($params{$key});
769 =head2 $req->uri_with( { key => 'value' } );
771 Returns a rewritten URI object for the current request. Key/value pairs
772 passed in will override existing parameters. You can remove an existing
773 parameter by passing in an undef value. Unmodified pairs will be
776 You may also pass an optional second parameter that puts C<uri_with> into
779 $req->uri_with( { key => 'value' }, { mode => 'append' } );
781 See C<mangle_params> for an explanation of this behavior.
786 my( $self, $args, $behavior) = @_;
788 carp( 'No arguments passed to uri_with()' ) unless $args;
791 if((ref($behavior) eq 'HASH') && defined($behavior->{mode}) && ($behavior->{mode} eq 'append')) {
795 my $params = $self->mangle_params($args, $append);
797 my $uri = $self->uri->clone;
798 $uri->query_form($params);
803 =head2 $req->remote_user
805 Returns the value of the C<REMOTE_USER> environment variable.
807 =head2 $req->user_agent
809 Shortcut to $req->headers->user_agent. Returns the user agent (browser)
818 Catalyst Contributors, see Catalyst.pm
822 This library is free software. You can redistribute it and/or modify
823 it under the same terms as Perl itself.
827 __PACKAGE__->meta->make_immutable;