X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine.pm;h=0c42af613c91ddf3864f80dd013fe54448b4d75b;hb=8c7d83e1a7ac65611e6063544e7f650a6270f5e6;hp=01b60c1b4722803e5dc1b5fc6bc39c350e5aeac3;hpb=847e3257e923336841ed6e6769cbc12ed0409e41;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm index 01b60c1..0c42af6 100644 --- a/lib/Catalyst/Engine.pm +++ b/lib/Catalyst/Engine.pm @@ -17,7 +17,7 @@ __PACKAGE__->mk_accessors(qw/read_position read_length/); use overload '""' => sub { return ref shift }, fallback => 1; # Amount of data to read from input on each pass -our $CHUNKSIZE = 4096; +our $CHUNKSIZE = 64 * 1024; =head1 NAME @@ -446,16 +446,41 @@ process the query string and extract query parameters. sub prepare_query_parameters { my ( $self, $c, $query_string ) = @_; + + # Make sure query has params + if ( index( $query_string, '=' ) < 0 ) { + return; + } + + my %query; # replace semi-colons $query_string =~ s/;/&/g; + + my @params = split /&/, $query_string; - my $u = URI->new( '', 'http' ); - $u->query($query_string); - for my $key ( $u->query_param ) { - my @vals = $u->query_param($key); - $c->request->query_parameters->{$key} = @vals > 1 ? [@vals] : $vals[0]; + for my $item ( @params ) { + + my ($param, $value) + = map { $self->unescape_uri($_) } + split( /=/, $item ); + + $param = $self->unescape_uri($item) unless defined $param; + + if ( exists $query{$param} ) { + if ( ref $query{$param} ) { + push @{ $query{$param} }, $value; + } + else { + $query{$param} = [ $query{$param}, $value ]; + } + } + else { + $query{$param} = $value; + } } + + $c->request->query_parameters( \%query ); } =head2 $self->prepare_read($c) @@ -607,6 +632,21 @@ sub write { print STDOUT $buffer; } +=head2 $self->unescape_uri($uri) + +Unescapes a given URI using the most efficient method available. Engines such +as Apache may implement this using Apache's C-based modules, for example. + +=cut + +sub unescape_uri { + my ( $self, $str ) = @_; + + $str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; + $str =~ s/\+/ /g; + + return $str; +} =head2 $self->finalize_output