un-TODO passing TODO tests
[catagits/Catalyst-Runtime.git] / t / aggregate / live_engine_request_escaped_path.t
CommitLineData
b4b58469 1#!/usr/bin/evn perl
7665bd7e 2use strict;
3use warnings;
4
5use FindBin;
6use lib "$FindBin::Bin/../lib";
7
8use Test::More tests => 6;
9use TestApp;
10use HTTP::Request::AsCGI;
11
12=pod
13
14This test exposes a problem in the handling of PATH_INFO in C::Engine::CGI (and
15other engines) where Catalyst does not un-escape the request correctly.
16If a request is URL-encoded then Catalyst fails to decode the request
17and thus will try and match actions using the URL-encoded value.
18
19Can NOT use Catalyst::Test as it uses HTTP::Request::AsCGI which does
20correctly unescape the path (by calling $uri = $uri->canonical).
21
22This will fix the problem for the CGI engine, but is probably the
23wrong place. And also does not fix $uri->base, either.
24
25Plus, the same issue is in Engine::Apache* and other engines.
26
27Index: 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.
7665bd7e 57 my $request = Catalyst::Utils::request( 'http://localhost/args/param%73/one/two' );
58 my $cgi = HTTP::Request::AsCGI->new( $request, %ENV )->setup;
59
60 # Reset PATH_INFO because AsCGI calls $uri = $uri->canonical which
61 # will unencode the path and hide the problem from the test.
62 $ENV{PATH_INFO} = '/args/param%73/one/two';
63
64
9ec0ae77 65 TestApp->handle_request( env => \%ENV );
7665bd7e 66
67 ok( my $response = $cgi->restore->response );
e065c229 68TODO: {
69 local $TODO = 'Actions should match when path parts are url encoded';
7665bd7e 70 ok( $response->is_success, 'Response Successful 2xx' );
71 is( $response->content, 'onetwo' );
72}
73