fix the bug Catalyst::Engine double decodes %2b back to ' ' (space)
Tatsuhiko Miyagawa [Thu, 13 Sep 2007 00:17:51 +0000 (00:17 +0000)]
lib/Catalyst/Engine.pm
t/live_engine_request_parameters.t

index c53bc12..089a959 100644 (file)
@@ -658,10 +658,9 @@ as Apache may implement this using Apache's C-based modules, for example.
 
 sub unescape_uri {
     my ( $self, $str ) = @_;
-    
-    $str =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
-    $str =~ s/\+/ /g;
-    
+
+    $str =~ s/(?:%([0-9A-Fa-f]{2})|\+)/defined $1 ? chr(hex($1)) : ' '/eg;
+
     return $str;
 }
 
index 851d4c5..1f1091f 100644 (file)
@@ -6,7 +6,7 @@ use warnings;
 use FindBin;
 use lib "$FindBin::Bin/lib";
 
-use Test::More tests => 30;
+use Test::More tests => 35;
 use Catalyst::Test 'TestApp';
 
 use Catalyst::Request;
@@ -39,6 +39,16 @@ use URI;
 
 {
     my $creq;
+    ok( my $response = request("http://localhost/dump/request?q=foo%2bbar"),
+        'Request' );
+    ok( $response->is_success, 'Response Successful 2xx' );
+    is( $response->content_type, 'text/plain', 'Response Content-Type' );
+    ok( eval '$creq = ' . $response->content );
+    is $creq->{parameters}->{q}, 'foo+bar', '%2b not double decoded';
+}
+
+{
+    my $creq;
 
     my $parameters = {
         'a'     => [qw(A b C d E f G)],