X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst.pm;h=3a8e5c38a7205408793e6abfd467924c505fb298;hp=3e3587af35b1dcf8fc03c20da7e6aeb083843a3d;hb=684ca75d81f91dc5302f1654d7029c93be4f5a37;hpb=25d61080a7e2ed2bdeac82055fcbeb632bf75b0c diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index 3e3587a..3a8e5c3 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -46,7 +46,16 @@ has state => (is => 'rw', default => 0); has stats => (is => 'rw'); has action => (is => 'rw'); has counter => (is => 'rw', default => sub { {} }); -has request => (is => 'rw', default => sub { $_[0]->request_class->new({}) }, required => 1, lazy => 1); +has request => ( + is => 'rw', + default => sub { + my $self = shift; + my %p; + $p{_uploadtmp} = $self->_uploadtmp if $self->_has_uploadtmp; + $self->request_class->new(\%p); + }, + lazy => 1, +); has response => (is => 'rw', default => sub { $_[0]->response_class->new({}) }, required => 1, lazy => 1); has namespace => (is => 'rw'); @@ -75,7 +84,7 @@ our $GO = Catalyst::Exception::Go->new; __PACKAGE__->mk_classdata($_) for qw/components arguments dispatcher engine log dispatcher_class engine_loader context_class request_class response_class stats_class - setup_finished _psgi_app loading_psgi_file/; + setup_finished _psgi_app loading_psgi_file run_options/; __PACKAGE__->dispatcher_class('Catalyst::Dispatcher'); __PACKAGE__->request_class('Catalyst::Request'); @@ -84,7 +93,7 @@ __PACKAGE__->stats_class('Catalyst::Stats'); # Remember to update this in Catalyst::Runtime as well! -our $VERSION = '5.90004'; +our $VERSION = '5.90006'; sub import { my ( $class, @arguments ) = @_; @@ -1393,11 +1402,12 @@ to interpolate all the parameters in the URI. =item @args? -Optional list of extra arguments - can be supplied in the C<< \@captures_and_args? >> -array ref, or here - whichever is easier for your code.. +Optional list of extra arguments - can be supplied in the +C<< \@captures_and_args? >> array ref, or here - whichever is easier for your +code. -If your action may have a zero, a fixed or a variable number of args (e.g. C<< Args(1) >> -for a fixed number or C<< Args() >> for a variable number).. +Your action can have zero, a fixed or a variable number of args (e.g. +C<< Args(1) >> for a fixed number or C<< Args() >> for a variable number).. =item \%query_values? @@ -1572,6 +1582,16 @@ sub welcome_message { EOF } +=head2 run_options + +Contains a hash of options passed from the application script, including +the original ARGV the script received, the processed values from that +ARGV and any extra arguments to the script which were not processed. + +This can be used to add custom options to your application's scripts +and setup your application differently depending on the values of these +options. + =head1 INTERNAL METHODS These methods are not meant to be used by end users. @@ -1972,6 +1992,11 @@ etc.). =cut +has _uploadtmp => ( + is => 'ro', + predicate => '_has_uploadtmp', +); + sub prepare { my ( $class, @arguments ) = @_; @@ -1980,11 +2005,11 @@ sub prepare { # into the application. $class->context_class( ref $class || $class ) unless $class->context_class; - my $c = $class->context_class->new({}); + my $uploadtmp = $class->config->{uploadtmp}; + my $c = $class->context_class->new({ $uploadtmp ? (_uploadtmp => $uploadtmp) : ()}); # For on-demand data $c->request->_context($c); - $c->response->_context($c); #surely this is not the most efficient way to do things... $c->stats($class->stats_class->new)->enable($c->use_stats); @@ -2001,8 +2026,6 @@ sub prepare { $c->prepare_request(@arguments); $c->prepare_connection; $c->prepare_query_parameters; - $c->prepare_headers; - $c->prepare_cookies; $c->prepare_path; # Prepare the body for reading, either by prepare_body @@ -2094,25 +2117,11 @@ Prepares connection. sub prepare_connection { my $c = shift; - $c->engine->prepare_connection( $c, @_ ); + # XXX - This is called on the engine (not the request) to maintain + # Engine::PSGI back compat. + $c->engine->prepare_connection($c); } -=head2 $c->prepare_cookies - -Prepares cookies. - -=cut - -sub prepare_cookies { my $c = shift; $c->engine->prepare_cookies( $c, @_ ) } - -=head2 $c->prepare_headers - -Prepares headers. - -=cut - -sub prepare_headers { my $c = shift; $c->engine->prepare_headers( $c, @_ ) } - =head2 $c->prepare_parameters Prepares parameters. @@ -2394,7 +2403,7 @@ $c->request. You must handle all body parsing yourself. =cut -sub read { my $c = shift; return $c->engine->read( $c, @_ ) } +sub read { my $c = shift; return $c->request->read( @_ ) } =head2 $c->run @@ -2641,7 +2650,7 @@ sub setup_engine { $meta->add_method(handler => sub { my $r = shift; - my $psgi_app = $class->psgi_app; + my $psgi_app = $class->_finalized_psgi_app; $apache->call_app($r, $psgi_app); }); @@ -2963,10 +2972,7 @@ your output data, if known. sub write { my $c = shift; - # Finalize headers if someone manually writes output - $c->finalize_headers; - - return $c->engine->write( $c, @_ ); + return $c->response->write( @_ ); } =head2 version @@ -3146,7 +3152,26 @@ headers. If you do not wish to use the proxy support at all, you may set: - MyApp->config(ignore_frontend_proxy => 1); + MyApp->config(ignore_frontend_proxy => 0); + +=head2 Note about psgi files + +Note that if you supply your own .psgi file, calling +C<< MyApp->psgi_app(@_); >>, then B. + +You either need to apply L yourself +in your psgi, for example: + + builder { + enable "Plack::Middleware::ReverseProxy"; + MyApp->psgi_app + }; + +This will unconditionally add the ReverseProxy support, or you need to call +C<< $app = MyApp->apply_default_middlewares($app) >> (to conditionally +apply the support depending upon your config). + +See L for more information. =head1 THREAD SAFETY