X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FCGI.pm;h=f9f9fa8114a589d6a956c711754acf291aba09ae;hb=4dfe7bde3aca93267c77e8537eff7535a31a7159;hp=fc2d02a2aeced17c2c64bfc01578d035eda61273;hpb=bb55391fcb8b0bac4e35ae0ed9a2425cccf234fc;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/CGI.pm b/lib/Catalyst/Engine/CGI.pm index fc2d02a..f9f9fa8 100644 --- a/lib/Catalyst/Engine/CGI.pm +++ b/lib/Catalyst/Engine/CGI.pm @@ -123,11 +123,12 @@ 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 || '/'; } +# $base_path .= '/' unless $base_path =~ m{/$}; # If we are running as a backend proxy, get the true hostname PROXY_CHECK: @@ -157,19 +158,15 @@ sub prepare_path { 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.. + 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. - if (substr($req_uri, 0, 1) ne '/') { - my ($match) = $req_uri =~ m|^([^/]+)|; - my ($path_info_part) = $path_info =~ m|^(.*?\Q$match)|; - substr($req_uri, 0, length($match), $path_info_part); - } + 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; } } @@ -195,7 +192,7 @@ sub prepare_path { my $query = $ENV{QUERY_STRING} ? '?' . $ENV{QUERY_STRING} : ''; my $uri = $scheme . '://' . $host . '/' . $path . $query; - $c->request->uri( bless \$uri, $uri_class ); + $c->request->uri( bless(\$uri, $uri_class)->canonical ); # set the base URI # base must end in a slash