Make legacy lighttpd env fixing work again
Florian Ragwitz [Wed, 2 Mar 2011 11:13:41 +0000 (12:13 +0100)]
lib/Catalyst.pm
t/aggregate/unit_core_engine_fixenv-lighttpd.t

index 972b390..9f25c7e 100644 (file)
@@ -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
index ea54e88..eeb0ca0 100644 (file)
@@ -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;