X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=trunk%2Ft%2Faggregate%2Flive_engine_request_escaped_path.t;fp=trunk%2Ft%2Faggregate%2Flive_engine_request_escaped_path.t;h=0512e6a069f735643d61507eee480d7109fe74f7;hb=ceae39c522c2145a453188867dd581062795ecee;hp=0000000000000000000000000000000000000000;hpb=f436bc1bece2bcc2a04138068e5c22e70d9d6d35;p=catagits%2FCatalyst-Runtime.git diff --git a/trunk/t/aggregate/live_engine_request_escaped_path.t b/trunk/t/aggregate/live_engine_request_escaped_path.t new file mode 100644 index 0000000..0512e6a --- /dev/null +++ b/trunk/t/aggregate/live_engine_request_escaped_path.t @@ -0,0 +1,73 @@ +#!/usr/bin/evn perl +use strict; +use warnings; + +use FindBin; +use lib "$FindBin::Bin/../lib"; + +use Test::More tests => 6; +use TestApp; +use HTTP::Request::AsCGI; + +=pod + +This test exposes a problem in the handling of PATH_INFO in C::Engine::CGI (and +other engines) where Catalyst does not un-escape the request correctly. +If a request is URL-encoded then Catalyst fails to decode the request +and thus will try and match actions using the URL-encoded value. + +Can NOT use Catalyst::Test as it uses HTTP::Request::AsCGI which does +correctly unescape the path (by calling $uri = $uri->canonical). + +This will fix the problem for the CGI engine, but is probably the +wrong place. And also does not fix $uri->base, either. + +Plus, the same issue is in Engine::Apache* and other engines. + +Index: lib/Catalyst/Engine/CGI.pm +=================================================================== +--- lib/Catalyst/Engine/CGI.pm (revision 7821) ++++ lib/Catalyst/Engine/CGI.pm (working copy) +@@ -157,6 +157,8 @@ + my $query = $ENV{QUERY_STRING} ? '?' . $ENV{QUERY_STRING} : ''; + my $uri = $scheme . '://' . $host . '/' . $path . $query; + ++ $uri = URI->new( $uri )->canonical; ++ + $c->request->uri( bless \$uri, $uri_class ); + + # set the base URI + +=cut + +# test that un-escaped can be feteched. +{ + + my $request = Catalyst::Utils::request( 'http://localhost/args/params/one/two' ); + my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup; + + TestApp->handle_request( env => \%ENV ); + + ok( my $response = $cgi->restore->response ); + ok( $response->is_success, 'Response Successful 2xx' ); + is( $response->content, 'onetwo' ); +} + +# test that request with URL-escaped code works. + my $request = Catalyst::Utils::request( 'http://localhost/args/param%73/one/two' ); + my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup; + + # Reset PATH_INFO because AsCGI calls $uri = $uri->canonical which + # will unencode the path and hide the problem from the test. + $ENV{PATH_INFO} = '/args/param%73/one/two'; + + + TestApp->handle_request( env => \%ENV ); + + ok( my $response = $cgi->restore->response ); +TODO: { + local $TODO = 'Actions should match when path parts are url encoded'; + ok( $response->is_success, 'Response Successful 2xx' ); + is( $response->content, 'onetwo' ); +} +