X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FRequest.pm;h=a5f144c32c84985982788fd856f0a3fe92a3ac52;hb=6e3de58fc7d0a4302fe9791c36346839ad91fb12;hp=ec7a96ade50458466c7dce37e53da3aa44cc0c3d;hpb=6680c772eaa987eafdb32e9437fd2d649dc914d9;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Request.pm b/lib/Catalyst/Request.pm index ec7a96a..a5f144c 100644 --- a/lib/Catalyst/Request.pm +++ b/lib/Catalyst/Request.pm @@ -10,6 +10,8 @@ use HTTP::Headers; use Moose; +with 'MooseX::Emulate::Class::Accessor::Fast'; + has action => (is => 'rw'); has address => (is => 'rw'); has arguments => (is => 'rw', default => sub { [] }); @@ -21,7 +23,7 @@ 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 uri => (is => 'rw', predicate => 'has_uri'); has user => (is => 'rw'); has headers => ( is => 'rw', @@ -32,9 +34,19 @@ 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, have the rest of +# these lazy build from there and kill all the direct hash access +# in Catalyst.pm and Engine.pm? + has _context => ( is => 'rw', weak_ref => 1, + handles => ['read'], + clearer => '_clear_context', ); has body_parameters => ( @@ -56,11 +68,6 @@ has uploads => ( default => sub { {} }, ); -before uploads => sub { - my ($self) = @_; - #$self->_context->prepare_body; -}; - has parameters => ( is => 'rw', required => 1, @@ -70,7 +77,6 @@ has parameters => ( 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(), " . @@ -86,7 +92,7 @@ has base => ( lazy => 1, default => sub { my $self = shift; - return $self->path if $self->uri; + return $self->path if $self->has_uri; }, ); @@ -105,10 +111,12 @@ has hostname => ( lazy => 1, default => sub { my ($self) = @_; - gethostbyaddr( inet_aton( $self->address ), AF_INET ) + gethostbyaddr( inet_aton( $self->address ), AF_INET ) || 'localhost' }, ); +has _path => ( is => 'rw', predicate => '_has_path', clearer => '_clear_path' ); + no Moose; sub args { shift->arguments(@_) } @@ -398,17 +406,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; } @@ -436,10 +444,6 @@ defaults to the size of the request if not specified. You have to set MyApp->config->{parse_on_demand} to use this directly. -=cut - -sub read { shift->_context->read(@_); } - =head2 $req->referer Shortcut for $req->headers->referer. Returns the referring page. @@ -450,7 +454,8 @@ Returns true or false, indicating whether the connection is secure (https). =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 }; @@ -533,7 +538,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 @@ -543,7 +549,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 ) { $_ = "$_"; @@ -551,11 +557,12 @@ 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; } @@ -576,9 +583,7 @@ Provided by Moose =head1 AUTHORS -Sebastian Riedel, C - -Marcus Ramberg, C +Catalyst Contributors, see Catalyst.pm =head1 COPYRIGHT