From: Florian Ragwitz Date: Wed, 2 Mar 2011 11:19:12 +0000 (+0100) Subject: Make legacy IIS env fixing work again X-Git-Tag: 5.89003~100 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=a6fb59b76c87d2339fc7b837e492f2e17fa5f841;hp=d89b863eba721ed2ab337220d1e52cfd039a81fe Make legacy IIS env fixing work again --- diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 9f25c7e..39962a6 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -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; } diff --git a/t/aggregate/unit_core_engine_fixenv-iis6.t b/t/aggregate/unit_core_engine_fixenv-iis6.t index 776199d..952711f 100644 --- a/t/aggregate/unit_core_engine_fixenv-iis6.t +++ b/t/aggregate/unit_core_engine_fixenv-iis6.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' => '/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;