X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=9f25c7ef053f203e9f2644df06cbfa7d49f62367;hb=d89b863eba721ed2ab337220d1e52cfd039a81fe;hp=3fc68c36a758f168eb75bf8a8fa22642f96327b6;hpb=1e5dad0099d51c919670c0e765615937b0fd4dae;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 3fc68c3..9f25c7e 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -30,10 +30,12 @@ use Class::C3::Adopt::NEXT; use List::MoreUtils qw/uniq/; use attributes; use String::RewritePrefix; -use Catalyst::Engine::Loader; +use Catalyst::EngineLoader; use utf8; use Carp qw/croak carp shortmess/; use Try::Tiny; +use Plack::Middleware::Conditional; +use Plack::Middleware::ReverseProxy; BEGIN { require 5.008004; } @@ -81,7 +83,7 @@ __PACKAGE__->stats_class('Catalyst::Stats'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.89000'; +our $VERSION = '5.89002'; sub import { my ( $class, @arguments ) = @_; @@ -1665,7 +1667,9 @@ sub execute { push( @{ $c->stack }, $code ); no warnings 'recursion'; - eval { $c->state( $code->execute( $class, $c, @{ $c->req->args } ) || 0 ) }; + # N.B. This used to be combined, but I have seen $c get clobbered if so, and + # I have no idea how, ergo $ret (which appears to fix the issue) + eval { my $ret = $code->execute( $class, $c, @{ $c->req->args } ) || 0; $c->state( $ret ) }; $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info; @@ -2405,7 +2409,7 @@ Starts the engine. =cut -sub run { my $c = shift; return $c->engine->run( $c, $c->psgi_app, @_ ) } +sub run { my $c = shift; return $c->engine->run( $c, $c->_finalized_psgi_app, @_ ) } =head2 $c->set_action( $action, $code, $namespace, $attrs ) @@ -2597,7 +2601,7 @@ sub engine_class { sub setup_engine { my ($class) = @_; - $class->engine_loader(Catalyst::Engine::Loader->new(application_name => $class)); + $class->engine_loader(Catalyst::EngineLoader->new(application_name => $class)); my $engine = $class->engine_class; Class::MOP::load_class($engine); @@ -2617,44 +2621,18 @@ sub setup_engine { return; } -=head2 $c->psgi_app - -Builds a PSGI application coderef for the catalyst application C<$c> using -Lsetup_psgi_app">, stores it internally, and returns it. On the next call -to this method, C won't be invoked again, but its persisted -return value of it will be returned. - -This is the top-level entrypoint for things that need a full blown Catalyst PSGI -app. If you only need the raw PSGI application, without any middlewares, use -Lraw_psgi_app"> instead. - -=cut - -sub psgi_app { +sub _finalized_psgi_app { my ($app) = @_; unless ($app->_psgi_app) { - my $psgi_app = $app->setup_psgi_app; + my $psgi_app = $app->_setup_psgi_app; $app->_psgi_app($psgi_app); } return $app->_psgi_app; } -=head2 $c->setup_psgi_app - -Builds a PSGI application coderef for the catalyst application C<$c>. - -If we're able to locate a C<${myapp}.psgi> file in the applications home -directory, we'll use that to obtain our code reference. - -Otherwise the raw psgi app, without any middlewares is created using -C and wrapped into L -conditionally. See L. - -=cut - -sub setup_psgi_app { +sub _setup_psgi_app { my ($app) = @_; if (my $home = Path::Class::Dir->new($app->config->{home})) { @@ -2666,12 +2644,18 @@ sub setup_psgi_app { if -e $psgi_file; } - # Note - this is for back compatibility. Catalyst should not know - # or care about how it's deployed. The recommended way of - # configuring this is now to use the ReverseProxy middleware - # yourself if you want it in a .psgi file. - return Plack::Middleware::Conditional->wrap( - $app->raw_psgi_app, + return $app->_wrapped_legacy_psgi_app($app->psgi_app); +} + +# Note - this is for back compatibility. Catalyst should not know or care about +# how it's deployed. The recommended way of configuring this is now to +# use the ReverseProxy middleware yourself if you want it in a .psgi +# file. +sub _wrapped_legacy_psgi_app { + my ($app, $psgi_app) = @_; + + $psgi_app = Plack::Middleware::Conditional->wrap( + $psgi_app, builder => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) }, condition => sub { my ($env) = @_; @@ -2680,18 +2664,47 @@ sub setup_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->raw_psgi_app +=head2 $c->psgi_app Returns a PSGI application code reference for the catalyst application C<$c>. This is the bare application without any middlewares -applied. C<${myapp}.psgi> is not taken into account. See -Lsetup_psgi_app">. +applied. C<${myapp}.psgi> is not taken into account. + +This is what you want to be using to retrieve the PSGI application code +reference of your Catalyst application for use in F<.psgi> files. =cut -sub raw_psgi_app { +sub psgi_app { my ($app) = @_; return $app->engine->build_psgi_app($app); } @@ -3235,6 +3248,8 @@ Yuval Kogman, C rainboxx: Matthias Dietrich, C +dd070: Dhaval Dhanani + =head1 LICENSE This library is free software. You can redistribute it and/or modify it under