X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FEngine.pm;h=e4deb9e309b8a855d1317066fb8185ee38f9ecf3;hp=44c9c126de58805feffbf2aad345286c111efca6;hb=6cf77e11ef210219fbbe19df5f5b7cd7c84f501c;hpb=9f3e69eeed571171a639f0af2a627da4baf9fc93 diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm index 44c9c12..e4deb9e 100644 --- a/lib/Catalyst/Engine.pm +++ b/lib/Catalyst/Engine.pm @@ -10,7 +10,7 @@ use HTML::Entities; use HTTP::Headers; use Plack::Loader; use Catalyst::EngineLoader; -use Encode 2.21 'decode_utf8'; +use Encode 2.21 'decode_utf8', 'encode', 'decode'; use Plack::Request::Upload; use Hash::MultiValue; use namespace::clean -except => 'meta'; @@ -573,6 +573,17 @@ process the query string and extract query parameters. sub prepare_query_parameters { my ($self, $c) = @_; my $env = $c->request->env; + my $do_not_decode_query = $c->config->{do_not_decode_query}; + my $default_query_encoding = $c->config->{default_query_encoding} || + ($c->config->{decode_query_using_global_encoding} ? + $c->encoding : 'UTF-8'); + + my $decoder = sub { + my $str = shift; + return $str if $do_not_decode_query; + return $str unless $default_query_encoding; + return decode( $default_query_encoding, $str); + }; my $query_string = exists $env->{QUERY_STRING} ? $env->{QUERY_STRING} @@ -582,7 +593,7 @@ sub prepare_query_parameters { # (yes, index() is faster than a regex :)) if ( index( $query_string, '=' ) < 0 ) { my $keywords = $self->unescape_uri($query_string); - $keywords = decode_utf8 $keywords; + $keywords = $decoder->($keywords); $c->request->query_keywords($keywords); return; } @@ -590,7 +601,7 @@ sub prepare_query_parameters { $query_string =~ s/\A[&;]+//; my $p = Hash::MultiValue->new( - map { defined $_ ? decode_utf8($self->unescape_uri($_)) : $_ } + map { defined $_ ? $decoder->($self->unescape_uri($_)) : $_ } map { ( split /=/, $_, 2 )[0,1] } # slice forces two elements split /[&;]+/, $query_string );