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