From: Florian Ragwitz Date: Wed, 2 Mar 2011 11:13:41 +0000 (+0100) Subject: Make legacy lighttpd env fixing work again X-Git-Tag: 5.89003~101 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=d89b863eba721ed2ab337220d1e52cfd039a81fe Make legacy lighttpd env fixing work again --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 972b390..9f25c7e 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -2654,7 +2654,7 @@ sub _setup_psgi_app { sub _wrapped_legacy_psgi_app { my ($app, $psgi_app) = @_; - return Plack::Middleware::Conditional->wrap( + $psgi_app = Plack::Middleware::Conditional->wrap( $psgi_app, builder => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) }, condition => sub { @@ -2664,6 +2664,33 @@ sub _wrapped_legacy_psgi_app { || $app->config->{using_frontend_proxy}; }, ); + + # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME + # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html + # Thanks to Mark Blythe for this fix + # + # Note that this has probably the same effect as + # Plack::Middleware::LighttpdScriptNameFix and we should switch to that if + # we can. + $psgi_app = Plack::Middleware::Conditional->wrap( + $psgi_app, + builder => sub { + my ($to_wrap) = @_; + return sub { + my ($env) = @_; + $env->{PATH_INFO} ||= delete $env->{SCRIPT_NAME}; + return $to_wrap->($env); + }; + }, + condition => sub { + my ($env) = @_; + my $server = $env->{SERVER_SOFTWARE}; + return unless $server; + return $server =~ /lighttpd/ ? 1 : 0; + }, + ); + + return $psgi_app; } =head2 $c->psgi_app diff --git a/t/aggregate/unit_core_engine_fixenv-lighttpd.t b/t/aggregate/unit_core_engine_fixenv-lighttpd.t index ea54e88..eeb0ca0 100644 --- a/t/aggregate/unit_core_engine_fixenv-lighttpd.t +++ b/t/aggregate/unit_core_engine_fixenv-lighttpd.t @@ -5,14 +5,7 @@ use warnings; use Test::More; -plan skip_all => 'Known broken currently'; - -eval "use FCGI"; -plan skip_all => 'FCGI required' if $@; - -plan tests => 2; - -require Catalyst::Engine::FastCGI; +use Catalyst (); my %env = ( 'SCRIPT_NAME' => '/bar', @@ -41,8 +34,23 @@ my %env = ( 'HTTP_HOST' => 'localhost:8000', ); -Catalyst::Engine::FastCGI->_fix_env(\%env); +sub fix_env { + my (%input_env) = @_; + + my $mangled_env; + my $app = Catalyst->_wrapped_legacy_psgi_app(sub { + my ($env) = @_; + $mangled_env = $env; + return [ 200, ['Content-Type' => 'text/plain'], [''] ]; + }); + + $app->({ %input_env, 'psgi.url_scheme' => 'http' }); + return %{ $mangled_env }; +} + +my %fixed_env = fix_env(%env); -is($env{PATH_INFO}, '/bar', 'check PATH_INFO'); -ok(!exists($env{SCRIPT_NAME}), 'check SCRIPT_NAME'); +is($fixed_env{PATH_INFO}, '/bar', 'check PATH_INFO'); +ok(!exists($fixed_env{SCRIPT_NAME}), 'check SCRIPT_NAME'); +done_testing;