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=afaa4144aeabecc004118c3006b4a706f8b61bb0;hp=21a26bffe3a5d53a43fa49f8138a6cb6d8474210;hb=536bee890cf24e0e4bcda7562e7b70cc03ca0620;hpb=0fc2d522eec43202c21e9f0062e43f10db4d9008 diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index 21a26bf..afaa414 100644 --- a/lib/Catalyst/Request.pm +++ b/lib/Catalyst/Request.pm @@ -1,6 +1,5 @@ package Catalyst::Request; -use Class::C3; use IO::Socket qw[AF_INET inet_aton]; use Carp; use utf8; @@ -11,6 +10,10 @@ use HTTP::Headers; use Moose; +use namespace::clean -except => 'meta'; + +with 'MooseX::Emulate::Class::Accessor::Fast'; + has action => (is => 'rw'); has address => (is => 'rw'); has arguments => (is => 'rw', default => sub { [] }); @@ -22,8 +25,8 @@ has protocol => (is => 'rw'); has query_parameters => (is => 'rw', default => sub { {} }); has secure => (is => 'rw', default => 0); has captures => (is => 'rw', default => sub { [] }); -has uri => (is => 'rw'); -has user => (is => 'rw'); +has uri => (is => 'rw', predicate => 'has_uri'); +has remote_user => (is => 'rw'); has headers => ( is => 'rw', isa => 'HTTP::Headers', @@ -33,16 +36,11 @@ has headers => ( lazy => 1, ); -#Moose ToDo: -#can we lose the before modifiers which just call prepare_body ? -#they are wasteful, slow us down and feel cluttery. -# Can we call prepare_body at BUILD time? -# Can we make _body an attribute and have the rest of these lazy build from there? - has _context => ( is => 'rw', weak_ref => 1, handles => ['read'], + clearer => '_clear_context', ); has body_parameters => ( @@ -52,24 +50,12 @@ has body_parameters => ( default => sub { {} }, ); -before body_parameters => sub { - my ($self) = @_; - $self->_context->prepare_body(); -}; - has uploads => ( is => 'rw', required => 1, - lazy => 1, default => sub { {} }, ); -# modifier was a noop (groditi) -# before uploads => sub { -# my ($self) = @_; -# #$self->_context->prepare_body; -# }; - has parameters => ( is => 'rw', required => 1, @@ -77,16 +63,33 @@ has parameters => ( default => sub { {} }, ); -before parameters => sub { - my ($self, $params) = @_; - #$self->_context->prepare_body(); - if ( $params && !ref $params ) { - $self->_context->log->warn( - "Attempt to retrieve '$params' with req->params(), " . - "you probably meant to call req->param('$params')" ); - $params = undef; - } +# TODO: +# - Can we lose the before modifiers which just call prepare_body ? +# they are wasteful, slow us down and feel cluttery. + +# Can we make _body an attribute, have the rest of +# these lazy build from there and kill all the direct hash access +# in Catalyst.pm and Engine.pm? +before $_ => sub { + my ($self) = @_; + my $context = $self->_context || return; + $context->prepare_body; +} for qw/parameters body_parameters/; + +around parameters => sub { + my ($orig, $self, $params) = @_; + if ($params) { + if ( !ref $params ) { + $self->_context->log->warn( + "Attempt to retrieve '$params' with req->params(), " . + "you probably meant to call req->param('$params')" + ); + $params = undef; + } + return $self->$orig($params); + } + $self->$orig(); }; has base => ( @@ -95,18 +98,21 @@ has base => ( lazy => 1, default => sub { my $self = shift; - return $self->path if $self->uri; + return $self->path if $self->has_uri; }, ); -has body => ( - is => 'rw' +has _body => ( + is => 'rw', clearer => '_clear_body', predicate => '_has_body', ); - -before body => sub { - my ($self) = @_; +# Eugh, ugly. Should just be able to rename accessor methods to 'body' +# and provide a custom reader.. +sub body { + my $self = shift; $self->_context->prepare_body(); -}; + $self->_body(@_) if scalar @_; + return blessed $self->_body ? $self->_body->body : $self->_body; +} has hostname => ( is => 'rw', @@ -114,11 +120,15 @@ has hostname => ( lazy => 1, default => sub { my ($self) = @_; - gethostbyaddr( inet_aton( $self->address ), AF_INET ) + gethostbyaddr( inet_aton( $self->address ), AF_INET ) || 'localhost' }, ); -no Moose; +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(@_) } @@ -209,13 +219,18 @@ For example, if your action was and the URI for the request was C, the string C would be the first and only argument. +Arguments get automatically URI-unescaped for you. + =head2 $req->args Shortcut for arguments. =head2 $req->base -Contains the URI base. This will always have a trailing slash. +Contains the URI base. This will always have a trailing slash. Note that the +URI scheme (eg., http vs. https) must be determined through heuristics; +depending on your server configuration, it may be incorrect. See $req->secure +for more info. If your application was queried with the URI C then C is C. @@ -398,7 +413,7 @@ Returns the path, i.e. the part of the URI after $req->base, for the current req =head2 $req->path_info -Alias for path, added for compability with L. +Alias for path, added for compatibility with L. =cut @@ -407,17 +422,17 @@ sub path { if (@params) { $self->uri->path(@params); - undef $self->{path}; + $self->_clear_path; } - elsif ( defined( my $path = $self->{path} ) ) { - return $path; + elsif ( $self->_has_path ) { + return $self->_path; } else { my $path = $self->uri->path; my $location = $self->base->path; $path =~ s/^(\Q$location\E)?//; $path =~ s/^\///; - $self->{path} = $path; + $self->_path($path); return $path; } @@ -451,17 +466,23 @@ Shortcut for $req->headers->referer. Returns the referring page. =head2 $req->secure -Returns true or false, indicating whether the connection is secure (https). +Returns true or false, indicating whether the connection is secure +(https). Note that the URI scheme (eg., http vs. https) must be determined +through heuristics, and therefore the reliablity 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. =head2 $req->captures -Returns a reference to an array containing regex captures. +Returns a reference to an array containing captured args from chained +actions or regex captures. my @captures = @{ $c->request->captures }; =head2 $req->snippets -C used to be called snippets. This is still available for backwoards +C used to be called snippets. This is still available for backwards compatibility, but is considered deprecated. =head2 $req->upload @@ -538,7 +559,8 @@ Returns a URI object for the current request. Stringifies to the URI text. =head2 $req->uri_with( { key => 'value' } ); Returns a rewritten URI object for the current request. Key/value pairs -passed in will override existing parameters. Unmodified pairs will be +passed in will override existing parameters. You can remove an existing +parameter by passing in an undef value. Unmodified pairs will be preserved. =cut @@ -548,7 +570,7 @@ sub uri_with { carp( 'No arguments passed to uri_with()' ) unless $args; - for my $value ( values %$args ) { + foreach my $value ( values %$args ) { next unless defined $value; for ( ref $value eq 'ARRAY' ? @$value : $value ) { $_ = "$_"; @@ -556,19 +578,24 @@ sub uri_with { } }; - my $uri = $self->uri->clone; - + my $uri = $self->uri->clone; + my %query = ( %{ $uri->query_form_hash }, %$args ); + $uri->query_form( { - %{ $uri->query_form_hash }, - %$args + # remove undef values + map { defined $query{ $_ } ? ( $_ => $query{ $_ } ) : () } keys %query } ); return $uri; } =head2 $req->user -Returns the currently logged in user. Deprecated. The method recommended for -newer plugins is $c->user. +Returns the currently logged in user. B, do not call, +this will be removed in version 5.81. + +=head2 $req->remote_user + +Returns the value of the C environment variable. =head2 $req->user_agent @@ -581,13 +608,11 @@ Provided by Moose =head1 AUTHORS -Sebastian Riedel, C - -Marcus Ramberg, C +Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT -This program is free software, you can redistribute it and/or modify +This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself. =cut