Commit | Line | Data |
b4b58469 |
1 | #!/usr/bin/evn perl |
7665bd7e |
2 | use strict; |
3 | use warnings; |
4 | |
5 | use FindBin; |
6 | use lib "$FindBin::Bin/../lib"; |
7 | |
8 | use Test::More tests => 6; |
9 | use TestApp; |
10 | use HTTP::Request::AsCGI; |
11 | |
12 | =pod |
13 | |
14 | This test exposes a problem in the handling of PATH_INFO in C::Engine::CGI (and |
15 | other engines) where Catalyst does not un-escape the request correctly. |
16 | If a request is URL-encoded then Catalyst fails to decode the request |
17 | and thus will try and match actions using the URL-encoded value. |
18 | |
19 | Can NOT use Catalyst::Test as it uses HTTP::Request::AsCGI which does |
20 | correctly unescape the path (by calling $uri = $uri->canonical). |
21 | |
22 | This will fix the problem for the CGI engine, but is probably the |
23 | wrong place. And also does not fix $uri->base, either. |
24 | |
25 | Plus, the same issue is in Engine::Apache* and other engines. |
26 | |
27 | Index: lib/Catalyst/Engine/CGI.pm |
28 | =================================================================== |
29 | --- lib/Catalyst/Engine/CGI.pm (revision 7821) |
30 | +++ lib/Catalyst/Engine/CGI.pm (working copy) |
31 | @@ -157,6 +157,8 @@ |
32 | my $query = $ENV{QUERY_STRING} ? '?' . $ENV{QUERY_STRING} : ''; |
33 | my $uri = $scheme . '://' . $host . '/' . $path . $query; |
34 | |
35 | + $uri = URI->new( $uri )->canonical; |
36 | + |
37 | $c->request->uri( bless \$uri, $uri_class ); |
38 | |
39 | # set the base URI |
40 | |
41 | =cut |
42 | |
43 | # test that un-escaped can be feteched. |
44 | { |
45 | |
46 | my $request = Catalyst::Utils::request( 'http://localhost/args/params/one/two' ); |
47 | my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup; |
48 | |
9ec0ae77 |
49 | TestApp->handle_request( env => \%ENV ); |
7665bd7e |
50 | |
51 | ok( my $response = $cgi->restore->response ); |
52 | ok( $response->is_success, 'Response Successful 2xx' ); |
53 | is( $response->content, 'onetwo' ); |
54 | } |
55 | |
56 | # test that request with URL-escaped code works. |
57 | TODO: { |
58 | local $TODO = 'Actions should match when path parts are url encoded'; |
59 | my $request = Catalyst::Utils::request( 'http://localhost/args/param%73/one/two' ); |
60 | my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup; |
61 | |
62 | # Reset PATH_INFO because AsCGI calls $uri = $uri->canonical which |
63 | # will unencode the path and hide the problem from the test. |
64 | $ENV{PATH_INFO} = '/args/param%73/one/two'; |
65 | |
66 | |
9ec0ae77 |
67 | TestApp->handle_request( env => \%ENV ); |
7665bd7e |
68 | |
69 | ok( my $response = $cgi->restore->response ); |
70 | ok( $response->is_success, 'Response Successful 2xx' ); |
71 | is( $response->content, 'onetwo' ); |
72 | } |
73 | |