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

index 9f25c7e..39962a6 100644 (file)
@@ -2690,6 +2690,38 @@ sub _wrapped_legacy_psgi_app {
         },
     );
 
+    $psgi_app = Plack::Middleware::Conditional->wrap(
+        $psgi_app,
+        builder => sub {
+            my ($to_wrap) = @_;
+            return sub {
+                my ($env) = @_;
+
+                my @script_name = split(m!/!, $env->{PATH_INFO});
+                my @path_translated = split(m!/|\\\\?!, $env->{PATH_TRANSLATED});
+                my @path_info;
+
+                while ($script_name[$#script_name] eq $path_translated[$#path_translated]) {
+                    pop(@path_translated);
+                    unshift(@path_info, pop(@script_name));
+                }
+
+                unshift(@path_info, '', '');
+
+                $env->{PATH_INFO} = join('/', @path_info);
+                $env->{SCRIPT_NAME} = join('/', @script_name);
+
+                return $to_wrap->($env);
+            };
+        },
+        condition => sub {
+            my ($env) = @_;
+            my $server = $env->{SERVER_SOFTWARE};
+            return unless $server;
+            return $server =~ /IIS\/[6-9]\.[0-9]/ ? 1 : 0;
+        },
+    );
+
     return $psgi_app;
 }
 
index 776199d..952711f 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' => '/koo/blurb',
@@ -57,8 +50,23 @@ my %env = (
     'HTTP_HOST' => '127.0.0.1:83'
 );
 
-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}, '//blurb', 'check PATH_INFO');
-is($env{SCRIPT_NAME}, '/koo', 'check SCRIPT_NAME');
+is($fixed_env{PATH_INFO}, '//blurb', 'check PATH_INFO');
+is($fixed_env{SCRIPT_NAME}, '/koo', 'check SCRIPT_NAME');
 
+done_testing;