X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=d70d4c48a3c9d69bb5d393f9c749cfe55e87bdc2;hp=388b71c4a7d9e6da0a8915c3a64f0e68c53eb5b0;hb=aceee8b5c5fa1198e7c77652ba58049d4582b8d8;hpb=c8f4781ebd33f0476ed38e1daf05b0fc04446637 diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 388b71c..d70d4c4 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -30,6 +30,7 @@ use Class::C3::Adopt::NEXT; use List::MoreUtils qw/uniq/; use attributes; use String::RewritePrefix; +use Catalyst::EngineLoader; use utf8; use Carp qw/croak carp shortmess/; use Try::Tiny; @@ -70,18 +71,17 @@ our $GO = Catalyst::Exception::Go->new; #maybe we should just make them attributes with a default? __PACKAGE__->mk_classdata($_) for qw/components arguments dispatcher engine log dispatcher_class - engine_class context_class request_class response_class stats_class - setup_finished/; + engine_loader context_class request_class response_class stats_class + setup_finished _psgi_app/; __PACKAGE__->dispatcher_class('Catalyst::Dispatcher'); -__PACKAGE__->engine_class('Catalyst::Engine'); __PACKAGE__->request_class('Catalyst::Request'); __PACKAGE__->response_class('Catalyst::Response'); __PACKAGE__->stats_class('Catalyst::Stats'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.80029'; +our $VERSION = '5.89001'; sub import { my ( $class, @arguments ) = @_; @@ -1116,7 +1116,10 @@ sub setup { $class->setup_log( delete $flags->{log} ); $class->setup_plugins( delete $flags->{plugins} ); $class->setup_dispatcher( delete $flags->{dispatcher} ); - $class->setup_engine( delete $flags->{engine} ); + if (my $engine = delete $flags->{engine}) { + $class->log->warn("Specifying the engine in ->setup is no longer supported, XXX FIXME"); + } + $class->setup_engine(); $class->setup_stats( delete $flags->{stats} ); for my $flag ( sort keys %{$flags} ) { @@ -1662,7 +1665,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; @@ -1859,7 +1864,7 @@ sub finalize_headers { } # Content-Length - if ( $response->body && !$response->content_length ) { + if ( defined $response->body && length $response->body && !$response->content_length ) { # get the length from a filehandle if ( blessed( $response->body ) && $response->body->can('read') || ref( $response->body ) eq 'GLOB' ) @@ -2373,11 +2378,11 @@ sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) } =head2 $c->request_class -Returns or sets the request class. +Returns or sets the request class. Defaults to L. =head2 $c->response_class -Returns or sets the response class. +Returns or sets the response class. Defaults to L. =head2 $c->read( [$maxlength] ) @@ -2586,60 +2591,26 @@ Sets up engine. =cut -sub setup_engine { - my ($class, $engine) = @_; +sub engine_class { + my $class = shift; + $class->engine_loader->catalyst_engine_class(@_); +} - unless ($engine) { - $engine = $class->engine_class; - } - else { - $engine = String::RewritePrefix->rewrite( { '' => 'Catalyst::Engine::', '+' => '' }, $engine ); - } +sub setup_engine { + my ($class) = @_; - $engine = 'Catalyst::Engine' if $engine eq 'Catalyst::Engine::HTTP'; + $class->engine_loader(Catalyst::EngineLoader->new(application_name => $class)); + my $engine = $class->engine_class; Class::MOP::load_class($engine); - # check for old engines that are no longer compatible - my $old_engine; - if ( $engine->isa('Catalyst::Engine::Apache') - && !Catalyst::Engine::Apache->VERSION ) - { - $old_engine = 1; - } - - elsif ( $engine->isa('Catalyst::Engine::Server::Base') - && Catalyst::Engine::Server->VERSION le '0.02' ) - { - $old_engine = 1; - } - - elsif ($engine->isa('Catalyst::Engine::HTTP::POE') - && $engine->VERSION eq '0.01' ) - { - $old_engine = 1; - } - - elsif ($engine->isa('Catalyst::Engine::Zeus') - && $engine->VERSION eq '0.01' ) - { - $old_engine = 1; - } - - if ($old_engine) { - Catalyst::Exception->throw( message => - qq/Engine "$engine" is not supported by this version of Catalyst/ - ); - } - if ($ENV{MOD_PERL}) { - require 'Catalyst/Engine/Loader.pm'; - my $apache = Catalyst::Engine::Loader->auto; + my $apache = $class->engine_loader->auto; # FIXME - Immutable $class->meta->add_method(handler => sub { my $r = shift; - my $app = $class->psgi_app; - $apache->call_app($r, $app); + my $psgi_app = $class->psgi_app; + $apache->call_app($r, $psgi_app); }); } @@ -2648,9 +2619,28 @@ 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 { my ($app) = @_; - $app->setup_psgi_app; + + unless ($app->_psgi_app) { + my $psgi_app = $app->setup_psgi_app; + $app->_psgi_app($psgi_app); + } + + return $app->_psgi_app; } =head2 $c->setup_psgi_app @@ -2678,6 +2668,10 @@ 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, builder => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) }, @@ -3243,6 +3237,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