X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FCGI.pm;h=da95c6c38e793d341023f4739bdcdf504ae02968;hb=f238bbd95e57622c2db1b7c2ee8bd747ce04f6fa;hp=c57c8a5ba25bfb230b57577cbc49bac2d9a9a8f9;hpb=ca78941c9da0a5d9ff5a400f5a8e5ef7f9308cd8;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/CGI.pm b/lib/Catalyst/Engine/CGI.pm index c57c8a5..da95c6c 100644 --- a/lib/Catalyst/Engine/CGI.pm +++ b/lib/Catalyst/Engine/CGI.pm @@ -123,7 +123,7 @@ sub prepare_path { my $base_path; if ( exists $ENV{REDIRECT_URL} ) { $base_path = $ENV{REDIRECT_URL}; - $base_path =~ s/$ENV{PATH_INFO}$//; + $base_path =~ s/\Q$ENV{PATH_INFO}\E$//; } else { $base_path = $script_name || '/'; @@ -148,29 +148,19 @@ sub prepare_path { } } - # RFC 3875: "Unlike a URI path, the PATH_INFO is not URL-encoded, - # and cannot contain path-segment parameters." This means PATH_INFO - # is always decoded, and the script can't distinguish / vs %2F. - # 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) { - # Note that if REQUEST_URI doesn't start with a /, then the user - # is probably using mod_rewrite or something to rewrite requests - # into a sub-path of their application.. - # 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. - if (substr($req_uri, 0, 1) ne '/') { - 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 ($c->config->{use_request_uri_for_path}) { + # RFC 3875: "Unlike a URI path, the PATH_INFO is not URL-encoded, + # and cannot contain path-segment parameters." This means PATH_INFO + # is always decoded, and the script can't distinguish / vs %2F. + # See https://issues.apache.org/bugzilla/show_bug.cgi?id=35256 + # Here we try to resurrect the original encoded URI from REQUEST_URI. + if (my $req_uri = $ENV{REQUEST_URI}) { + if (defined $script_name) { + $req_uri =~ s/^\Q$script_name\E//; } - $path_info = $req_uri; + $req_uri =~ s/\?.*$//; + $path_info = $req_uri if $req_uri; } } @@ -203,7 +193,7 @@ sub prepare_path { my $base_uri = $scheme . '://' . $host . $base_path; - $c->request->base( bless(\$base_uri, $uri_class)->canonical ); + $c->request->base( bless \$base_uri, $uri_class ); } =head2 $self->prepare_query_parameters($c)