X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=388b71c4a7d9e6da0a8915c3a64f0e68c53eb5b0;hb=c8f4781ebd33f0476ed38e1daf05b0fc04446637;hp=2c96b1527ff65a82bd0a827d48f748c9f45c29e3;hpb=518576166dfa8607e2a0384ac46fa061dd931884;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 2c96b15..388b71c 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -71,7 +71,7 @@ our $GO = Catalyst::Exception::Go->new; __PACKAGE__->mk_classdata($_) for qw/components arguments dispatcher engine log dispatcher_class engine_class context_class request_class response_class stats_class - setup_finished psgi_app/; + setup_finished/; __PACKAGE__->dispatcher_class('Catalyst::Dispatcher'); __PACKAGE__->engine_class('Catalyst::Engine'); @@ -2644,8 +2644,64 @@ sub setup_engine { } $class->engine( $engine->new ); - $class->psgi_app( $class->engine->build_psgi_app($class) ); + return; +} + +sub psgi_app { + my ($app) = @_; + $app->setup_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 { + my ($app) = @_; + + if (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; + } + + return Plack::Middleware::Conditional->wrap( + $app->raw_psgi_app, + builder => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) }, + condition => sub { + my ($env) = @_; + return if $app->config->{ignore_frontend_proxy}; + return $env->{REMOTE_ADDR} eq '127.0.0.1' + || $app->config->{using_frontend_proxy}; + }, + ); +} + +=head2 $c->raw_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">. + +=cut + +sub raw_psgi_app { + my ($app) = @_; + return $app->engine->build_psgi_app($app); } =head2 $c->setup_home