X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=6e9d63cdaae2a2ba7395fbeb09d50447ee46227f;hp=a4278fd87482f91604fa4e4c555d31af85ded8ae;hb=84755bc3c6c73deaa10f3f7ba4e1a0432220c9fc;hpb=a8153308d08f22bb044515c822f973fe8680d213
diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm
index a4278fd..6e9d63c 100644
--- a/lib/Catalyst.pm
+++ b/lib/Catalyst.pm
@@ -84,7 +84,7 @@ __PACKAGE__->stats_class('Catalyst::Stats');
# Remember to update this in Catalyst::Runtime as well!
-our $VERSION = '5.89003';
+our $VERSION = '5.90002';
sub import {
my ( $class, @arguments ) = @_;
@@ -1863,9 +1863,18 @@ sub finalize_headers {
if ( !$response->has_body ) {
# Add a default body if none is already present
- $response->body(
- qq{
This item has moved here.
}
- );
+ $response->body(<<"EOF");
+
+
+
+ Moved
+
+
+ This item has moved here.
+
+
+EOF
+ $response->content_type('text/html; charset=utf-8');
}
}
@@ -1976,7 +1985,7 @@ sub handle_request {
return $status;
}
-=head2 $c->prepare( @arguments )
+=head2 $class->prepare( @arguments )
Creates a Catalyst context from an engine-specific request (Apache, CGI,
etc.).
@@ -2726,34 +2735,10 @@ sub apply_default_middlewares {
},
);
- my $server_matches = sub {
- my ($re) = @_;
- return sub {
- my ($env) = @_;
- my $server = $env->{SERVER_SOFTWARE};
- return unless $server;
- return $server =~ $re ? 1 : 0;
- };
- };
-
# If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
# http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
$psgi_app = Plack::Middleware::LighttpdScriptNameFix->wrap($psgi_app);
- $psgi_app = Plack::Middleware::Conditional->wrap(
- $psgi_app,
- condition => $server_matches->(qr/^nginx/),
- builder => sub {
- my ($to_wrap) = @_;
- return sub {
- my ($env) = @_;
- my $script_name = $env->{SCRIPT_NAME};
- $env->{PATH_INFO} =~ s/^$script_name//g;
- return $to_wrap->($env);
- };
- },
- );
-
# we're applying this unconditionally as the middleware itself already makes
# sure it doesn't fuck things up if it's not running under one of the right
# IIS versions
@@ -3061,8 +3046,46 @@ to be shown in hit debug tables in the test server.
=item *
C - Controlls if the C or C environment
-variable should be used for determining the request path. See L
-for more information.
+variable should be used for determining the request path.
+
+Most web server environments pass the requested path to the application using environment variables,
+from which Catalyst has to reconstruct the request base (i.e. the top level path to / in the application,
+exposed as C<< $c->request->base >>) and the request path below that base.
+
+There are two methods of doing this, both of which have advantages and disadvantages. Which method is used
+is determined by the C<< $c->config(use_request_uri_for_path) >> setting (which can either be true or false).
+
+=over
+
+=item use_request_uri_for_path => 0
+
+This is the default (and the) traditional method that Catalyst has used for determining the path information.
+The path is synthesised from a combination of the C and C environment variables.
+The allows the application to behave correctly when C is being used to redirect requests
+into the application, as these variables are adjusted by mod_rewrite to take account for the redirect.
+
+However this method has the major disadvantage that it is impossible to correctly decode some elements
+of the path, as RFC 3875 says: "C<< Unlike a URI path, the PATH_INFO is not URL-encoded, and cannot
+contain path-segment parameters. >>" This means PATH_INFO is B decoded, and therefore Catalyst
+can't distinguish / vs %2F in paths (in addition to other encoded values).
+
+=item use_request_uri_for_path => 1
+
+This method uses the C and C environment variables. As C is never
+decoded, this means that applications using this mode can correctly handle URIs including the %2F character
+(i.e. with C set to C in Apache).
+
+Given that this method of path resolution is provably more correct, it is recommended that you use
+this unless you have a specific need to deploy your application in a non-standard environment, and you are
+aware of the implications of not being able to handle encoded URI paths correctly.
+
+However it also means that in a number of cases when the app isn't installed directly at a path, but instead
+is having paths rewritten into it (e.g. as a .cgi/fcgi in a public_html directory, with mod_rewrite in a
+.htaccess file, or when SSI is used to rewrite pages into the app, or when sub-paths of the app are exposed
+at other URIs than that which the app is 'normally' based at with C), the resolution of
+C<< $c->request->base >> will be incorrect.
+
+=back
=item *