From: Tomas Doran Date: Sun, 2 May 2010 22:26:22 +0000 (+0000) Subject: Revert to old behaviour, allow config for new behaviour. Config option name is rubbis... X-Git-Tag: 5.80025~2^2~13^2~3^2~8 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=081ea9220deb31273cc4e778d6debdb96256beda Revert to old behaviour, allow config for new behaviour. Config option name is rubbish, needs fixing --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 34d3d58..04a8ad4 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -1321,7 +1321,7 @@ sub uri_for { # join args with '/', or a blank string my $args = join('/', grep { defined($_) } @args); $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE -# $args =~ s!^/+!!; + $args =~ s!^/+!!; my $base = $c->req->base; my $class = ref($base); $base =~ s{(?dispatcher->get_actions( $c, @_ ) } -=head2 $c->handle_request( $class, @arguments ) +=head2 $app->handle_request( @arguments ) Called to handle each HTTP request. diff --git a/lib/Catalyst/Engine/CGI.pm b/lib/Catalyst/Engine/CGI.pm index 3f2ef67..318240d 100644 --- a/lib/Catalyst/Engine/CGI.pm +++ b/lib/Catalyst/Engine/CGI.pm @@ -154,27 +154,28 @@ sub prepare_path { # See https://issues.apache.org/bugzilla/show_bug.cgi?id=35256 # Here we try to resurrect the original encoded URI from REQUEST_URI. my $path_info = $ENV{PATH_INFO}; -# if (my $req_uri = $ENV{REQUEST_URI}) { -# $req_uri =~ s/^\Q$base_path\E//; -# $req_uri =~ s/\?.*$//; -# if ($req_uri && $req_uri ne '/') { - # This means that REQUEST_URI needs information from PATH_INFO - # prepending to it to be useful, otherwise the sub path which is - # being redirected to becomes the app base address which is - # incorrect. -# my ($match) = $req_uri =~ m{^(/?[^/]+)}; -# my ($path_info_part) = $path_info =~ m|^(.*?\Q$match\E)|; -# substr($req_uri, 0, length($match), $path_info_part) -# if $path_info_part; -# $path_info = $req_uri; -# } -# } - $path_info =~ s/%2F/%252F/g; + if ($c->config->{rfc3875_paths}) { + if (my $req_uri = $ENV{REQUEST_URI}) { + $req_uri =~ s/^\Q$base_path\E//; + $req_uri =~ s/\?.*$//; + if ($req_uri && $req_uri ne '/') { + # This means that REQUEST_URI needs information from PATH_INFO + # prepending to it to be useful, otherwise the sub path which is + # being redirected to becomes the app base address which is + # incorrect. + # FIXME - This stuff is shit, we should get REDIRECT_URI, right? + my ($match) = $req_uri =~ m{^(/?[^/]+)}; + my ($path_info_part) = $path_info =~ m|^(.*?\Q$match\E)|; + substr($req_uri, 0, length($match), $path_info_part) + if $path_info_part; + $path_info = $req_uri; + } + } + } + # set the request URI - warn("Base path $base_path, path_info $path_info"); my $path = $base_path . ( $path_info || '' ); $path =~ s{^/+}{}; - $base_path .= '/' unless $base_path =~ m{/$}; # Using URI directly is way too slow, so we construct the URLs manually my $uri_class = "URI::$scheme"; diff --git a/t/aggregate/live_component_controller_args.t b/t/aggregate/live_component_controller_args.t index 29d26a1..93b757c 100644 --- a/t/aggregate/live_component_controller_args.t +++ b/t/aggregate/live_component_controller_args.t @@ -73,15 +73,15 @@ sub run_test_for { my $response; - ok( $response = request("http://localhost/args/args/$path"), "Requested args for path $path"); + ok( $response = request("http://localhost/args/args/$path"), "Requested /args/args/$path"); is( $response->content, $test, "$test as args" ); undef $response; - ok( $response = request("http://localhost/args/params/$path"), "Requested params for path $path"); + ok( $response = request("http://localhost/args/params/$path"), "Requested /args/params/$path"); - is( $response->content, $test, "$test as params" ); + is( $response->content, $test, "response content $test as params" ); undef $response; diff --git a/t/lib/TestApp.pm b/t/lib/TestApp.pm index 1e4d5c4..9ee303d 100644 --- a/t/lib/TestApp.pm +++ b/t/lib/TestApp.pm @@ -18,7 +18,7 @@ use namespace::autoclean; our $VERSION = '0.01'; -TestApp->config( name => 'TestApp', root => '/some/dir' ); +TestApp->config( name => 'TestApp', root => '/some/dir', rfc3875_paths => 1 ); if ($::setup_leakchecker && eval { Class::MOP::load_class('CatalystX::LeakChecker'); 1 }) { with 'CatalystX::LeakChecker';