X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=3ad1701a2cb0a938e9ed9dddbc6e2a88cd144b72;hb=1085c936f6ea024206a1aee192a87c4c9fc79087;hp=696fd5795e0d1e8753de58374086c1541cc8c86f;hpb=1f440f555345b577d87e1b7e159aaa24121318ca;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 696fd57..3ad1701 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -34,6 +34,9 @@ use Catalyst::EngineLoader; use utf8; use Carp qw/croak carp shortmess/; use Try::Tiny; +use Plack::Middleware::Conditional; +use Plack::Middleware::ReverseProxy; +use Plack::Middleware::IIS6ScriptNameFix; BEGIN { require 5.008004; } @@ -2597,9 +2600,18 @@ sub engine_class { } sub setup_engine { - my ($class) = @_; - - $class->engine_loader(Catalyst::EngineLoader->new(application_name => $class)); + my ($class, $compat_requested_engine) = @_; + + $class->engine_loader( + Catalyst::EngineLoader->new({ + application_name => $class, + (!defined $compat_requested_engine + ? () + : (compat_options => { + requested_engine => $compat_requested_engine, + })), + }), + ); my $engine = $class->engine_class; Class::MOP::load_class($engine); @@ -2633,16 +2645,30 @@ sub _finalized_psgi_app { sub _setup_psgi_app { my ($app) = @_; - if (my $home = Path::Class::Dir->new($app->config->{home})) { + for my $home (Path::Class::Dir->new($app->config->{home})) { my $psgi_file = $home->file( Catalyst::Utils::appprefix($app) . '.psgi', ); - return Plack::Util::load_psgi($psgi_file) - if -e $psgi_file; + next unless -e $psgi_file; + my $psgi_app = Plack::Util::load_psgi($psgi_file); + + return $psgi_app + unless $app->engine_loader->needs_psgi_engine_compat_hack; + + # load_psgi ran a .psgi file doing ->setup_engine('PSGI'). That's what + # .psgi files generated by the old Engine::PSGI do. Those return an app + # coderef calling into MyApp->run, which doesn't work anymore, so we're + # just ignoring it and use the wrapped legacy psgi app + warn <<"EOW"; +Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}. + +Its content has been ignored. Please consult the Catalyst::Upgrading +documentation on how to upgrade from Catalyst::Engine::PSGI. +EOW } - return $app->_wrapped_legacy_psgi_app; + return $app->_wrapped_legacy_psgi_app($app->psgi_app); } # Note - this is for back compatibility. Catalyst should not know or care about @@ -2650,10 +2676,10 @@ sub _setup_psgi_app { # use the ReverseProxy middleware yourself if you want it in a .psgi # file. sub _wrapped_legacy_psgi_app { - my ($app) = @_; + my ($app, $psgi_app) = @_; - return Plack::Middleware::Conditional->wrap( - $app->psgi_app, + $psgi_app = Plack::Middleware::Conditional->wrap( + $psgi_app, builder => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) }, condition => sub { my ($env) = @_; @@ -2662,6 +2688,57 @@ sub _wrapped_legacy_psgi_app { || $app->config->{using_frontend_proxy}; }, ); + + 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 + # 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, + condition => $server_matches->(qr/lighttpd/), + builder => sub { + my ($to_wrap) = @_; + return sub { + my ($env) = @_; + $env->{PATH_INFO} ||= delete $env->{SCRIPT_NAME}; + return $to_wrap->($env); + }; + }, + ); + + $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 + $psgi_app = Plack::Middleware::IIS6ScriptNameFix->wrap($psgi_app); + + return $psgi_app; } =head2 $c->psgi_app