4 use Moose::Meta::Class ();
5 extends 'Catalyst::Component';
6 use Moose::Util qw/find_meta/;
7 use B::Hooks::EndOfScope ();
8 use Catalyst::Exception;
9 use Catalyst::Exception::Detach;
10 use Catalyst::Exception::Go;
12 use Catalyst::Request;
13 use Catalyst::Request::Upload;
14 use Catalyst::Response;
16 use Catalyst::Controller;
19 use Text::SimpleTable ();
20 use Path::Class::Dir ();
21 use Path::Class::File ();
25 use Tree::Simple qw/use_weak_refs/;
26 use Tree::Simple::Visitor::FindByUID;
27 use Class::C3::Adopt::NEXT;
28 use List::MoreUtils qw/uniq/;
30 use String::RewritePrefix;
31 use Catalyst::EngineLoader;
33 use Carp qw/croak carp shortmess/;
35 use Plack::Middleware::Conditional;
36 use Plack::Middleware::ReverseProxy;
37 use Plack::Middleware::IIS6ScriptNameFix;
38 use Plack::Middleware::LighttpdScriptNameFix;
40 BEGIN { require 5.008004; }
42 has stack => (is => 'ro', default => sub { [] });
43 has stash => (is => 'rw', default => sub { {} });
44 has state => (is => 'rw', default => 0);
45 has stats => (is => 'rw');
46 has action => (is => 'rw');
47 has counter => (is => 'rw', default => sub { {} });
48 has request => (is => 'rw', default => sub { $_[0]->request_class->new({}) }, required => 1, lazy => 1);
49 has response => (is => 'rw', default => sub { $_[0]->response_class->new({}) }, required => 1, lazy => 1);
50 has namespace => (is => 'rw');
52 sub depth { scalar @{ shift->stack || [] }; }
53 sub comp { shift->component(@_) }
56 my $self = shift; return $self->request(@_);
59 my $self = shift; return $self->response(@_);
62 # For backwards compatibility
63 sub finalize_output { shift->finalize_body(@_) };
68 our $RECURSION = 1000;
69 our $DETACH = Catalyst::Exception::Detach->new;
70 our $GO = Catalyst::Exception::Go->new;
72 #I imagine that very few of these really need to be class variables. if any.
73 #maybe we should just make them attributes with a default?
74 __PACKAGE__->mk_classdata($_)
76 for qw/container arguments dispatcher engine log dispatcher_class
77 engine_class context_class request_class response_class stats_class
80 for qw/components arguments dispatcher engine log dispatcher_class
81 engine_loader context_class request_class response_class stats_class
82 setup_finished _psgi_app loading_psgi_file/;
85 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
86 __PACKAGE__->request_class('Catalyst::Request');
87 __PACKAGE__->response_class('Catalyst::Response');
88 __PACKAGE__->stats_class('Catalyst::Stats');
90 # Remember to update this in Catalyst::Runtime as well!
92 our $VERSION = '5.90001';
95 my ( $class, @arguments ) = @_;
97 # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
99 return unless $class eq 'Catalyst';
101 my $caller = caller();
102 return if $caller eq 'main';
104 my $meta = Moose::Meta::Class->initialize($caller);
106 unless ( $caller->isa('Catalyst') ) { # XXX - Remove!
107 my @superclasses = ($meta->superclasses, $class, 'Catalyst::Component'); # XXX - Remove!
108 $meta->superclasses(@superclasses); # XXX - Remove!
111 # Avoid possible C3 issues if 'Moose::Object' is already on RHS of MyApp
112 $meta->superclasses(grep { $_ ne 'Moose::Object' } $meta->superclasses);
114 unless( $meta->has_method('meta') ){
115 if ($Moose::VERSION >= 1.15) {
116 $meta->_add_meta_method('meta');
119 $meta->add_method(meta => sub { Moose::Meta::Class->initialize("${caller}") } );
123 $caller->arguments( [@arguments] );
127 sub MODIFY_CODE_ATTRIBUTES {
128 Catalyst::Exception->throw(
129 "Catalyst applications (aka MyApp) cannot be controllers anymore. " .
130 "That has been deprecated and removed. You should create a " .
131 "controller class called Root.pm, and move relevant code to that class."
136 sub _application { $_[0] }
140 Catalyst - The Elegant MVC Web Application Framework
144 See the L<Catalyst::Manual> distribution for comprehensive
145 documentation and tutorials.
147 # Install Catalyst::Devel for helpers and other development tools
148 # use the helper to create a new application
151 # add models, views, controllers
152 script/myapp_create.pl model MyDatabase DBIC::Schema create=static dbi:SQLite:/path/to/db
153 script/myapp_create.pl view MyTemplate TT
154 script/myapp_create.pl controller Search
156 # built in testserver -- use -r to restart automatically on changes
157 # --help to see all available options
158 script/myapp_server.pl
160 # command line testing interface
161 script/myapp_test.pl /yada
164 use Catalyst qw/-Debug/; # include plugins here as well
166 ### In lib/MyApp/Controller/Root.pm (autocreated)
167 sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc.
168 my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
169 $c->stash->{template} = 'foo.tt'; # set the template
170 # lookup something from db -- stash vars are passed to TT
172 $c->model('Database::Foo')->search( { country => $args[0] } );
173 if ( $c->req->params->{bar} ) { # access GET or POST parameters
174 $c->forward( 'bar' ); # process another action
175 # do something else after forward returns
179 # The foo.tt TT template can use the stash data from the database
180 [% WHILE (item = data.next) %]
184 # called for /bar/of/soap, /bar/of/soap/10, etc.
185 sub bar : Path('/bar/of/soap') { ... }
187 # called for all actions, from the top-most controller downwards
189 my ( $self, $c ) = @_;
190 if ( !$c->user_exists ) { # Catalyst::Plugin::Authentication
191 $c->res->redirect( '/login' ); # require login
192 return 0; # abort request and go immediately to end()
194 return 1; # success; carry on to next action
197 # called after all actions are finished
199 my ( $self, $c ) = @_;
200 if ( scalar @{ $c->error } ) { ... } # handle errors
201 return if $c->res->body; # already have a response
202 $c->forward( 'MyApp::View::TT' ); # render template
205 ### in MyApp/Controller/Foo.pm
206 # called for /foo/bar
207 sub bar : Local { ... }
209 # called for /blargle
210 sub blargle : Global { ... }
212 # an index action matches /foo, but not /foo/1, etc.
213 sub index : Private { ... }
215 ### in MyApp/Controller/Foo/Bar.pm
216 # called for /foo/bar/baz
217 sub baz : Local { ... }
219 # first Root auto is called, then Foo auto, then this
220 sub auto : Private { ... }
222 # powerful regular expression paths are also possible
223 sub details : Regex('^product/(\w+)/details$') {
224 my ( $self, $c ) = @_;
225 # extract the (\w+) from the URI
226 my $product = $c->req->captures->[0];
229 See L<Catalyst::Manual::Intro> for additional information.
233 Catalyst is a modern framework for making web applications without the
234 pain usually associated with this process. This document is a reference
235 to the main Catalyst application. If you are a new user, we suggest you
236 start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
238 See L<Catalyst::Manual> for more documentation.
240 Catalyst plugins can be loaded by naming them as arguments to the "use
241 Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
242 plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
245 use Catalyst qw/My::Module/;
247 If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
248 fully qualify the name by using a unary plus:
252 +Fully::Qualified::Plugin::Name
255 Special flags like C<-Debug> and C<-Engine> can also be specified as
256 arguments when Catalyst is loaded:
258 use Catalyst qw/-Debug My::Module/;
260 The position of plugins and flags in the chain is important, because
261 they are loaded in the order in which they appear.
263 The following flags are supported:
267 Enables debug output. You can also force this setting from the system
268 environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
269 settings override the application, with <MYAPP>_DEBUG having the highest
272 This sets the log level to 'debug' and enables full debug output on the
273 error screen. If you only want the latter, see L<< $c->debug >>.
277 Forces Catalyst to use a specific engine. Omit the
278 C<Catalyst::Engine::> prefix of the engine name, i.e.:
280 use Catalyst qw/-Engine=CGI/;
284 Forces Catalyst to use a specific home directory, e.g.:
286 use Catalyst qw[-Home=/usr/mst];
288 This can also be done in the shell environment by setting either the
289 C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
290 is replaced with the uppercased name of your application, any "::" in
291 the name will be replaced with underscores, e.g. MyApp::Web should use
292 MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
294 If none of these are set, Catalyst will attempt to automatically detect the
295 home directory. If you are working in a development envirnoment, Catalyst
296 will try and find the directory containing either Makefile.PL, Build.PL or
297 dist.ini. If the application has been installed into the system (i.e.
298 you have done C<make install>), then Catalyst will use the path to your
299 application module, without the .pm extension (ie, /foo/MyApp if your
300 application was installed at /foo/MyApp.pm)
304 use Catalyst '-Log=warn,fatal,error';
306 Specifies a comma-delimited list of log levels.
310 Enables statistics collection and reporting.
312 use Catalyst qw/-Stats=1/;
314 You can also force this setting from the system environment with CATALYST_STATS
315 or <MYAPP>_STATS. The environment settings override the application, with
316 <MYAPP>_STATS having the highest priority.
318 Stats are also enabled if L<< debugging |/"-Debug" >> is enabled.
322 =head2 INFORMATION ABOUT THE CURRENT REQUEST
326 Returns a L<Catalyst::Action> object for the current action, which
327 stringifies to the action name. See L<Catalyst::Action>.
331 Returns the namespace of the current action, i.e., the URI prefix
332 corresponding to the controller of the current action. For example:
334 # in Controller::Foo::Bar
335 $c->namespace; # returns 'foo/bar';
341 Returns the current L<Catalyst::Request> object, giving access to
342 information about the current client request (including parameters,
343 cookies, HTTP headers, etc.). See L<Catalyst::Request>.
345 =head2 REQUEST FLOW HANDLING
347 =head2 $c->forward( $action [, \@arguments ] )
349 =head2 $c->forward( $class, $method, [, \@arguments ] )
351 Forwards processing to another action, by its private name. If you give a
352 class name but no method, C<process()> is called. You may also optionally
353 pass arguments in an arrayref. The action will receive the arguments in
354 C<@_> and C<< $c->req->args >>. Upon returning from the function,
355 C<< $c->req->args >> will be restored to the previous values.
357 Any data C<return>ed from the action forwarded to, will be returned by the
360 my $foodata = $c->forward('/foo');
361 $c->forward('index');
362 $c->forward(qw/Model::DBIC::Foo do_stuff/);
363 $c->forward('View::TT');
365 Note that L<< forward|/"$c->forward( $action [, \@arguments ] )" >> implies
366 an C<< eval { } >> around the call (actually
367 L<< execute|/"$c->execute( $class, $coderef )" >> does), thus de-fatalizing
368 all 'dies' within the called action. If you want C<die> to propagate you
369 need to do something like:
372 die join "\n", @{ $c->error } if @{ $c->error };
374 Or make sure to always return true values from your actions and write
377 $c->forward('foo') || return;
379 Another note is that C<< $c->forward >> always returns a scalar because it
380 actually returns $c->state which operates in a scalar context.
381 Thus, something like:
385 in an action that is forwarded to is going to return a scalar,
386 i.e. how many items are in that array, which is probably not what you want.
387 If you need to return an array then return a reference to it,
390 $c->stash->{array} = \@array;
392 and access it from the stash.
394 Keep in mind that the C<end> method used is that of the caller action. So a C<$c-E<gt>detach> inside a forwarded action would run the C<end> method from the original action requested.
398 sub forward { my $c = shift; no warnings 'recursion'; $c->dispatcher->forward( $c, @_ ) }
400 =head2 $c->detach( $action [, \@arguments ] )
402 =head2 $c->detach( $class, $method, [, \@arguments ] )
406 The same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, but
407 doesn't return to the previous action when processing is finished.
409 When called with no arguments it escapes the processing chain entirely.
413 sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
415 =head2 $c->visit( $action [, \@captures, \@arguments ] )
417 =head2 $c->visit( $class, $method, [, \@captures, \@arguments ] )
419 Almost the same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>,
420 but does a full dispatch, instead of just calling the new C<$action> /
421 C<< $class->$method >>. This means that C<begin>, C<auto> and the method
422 you go to are called, just like a new request.
424 In addition both C<< $c->action >> and C<< $c->namespace >> are localized.
425 This means, for example, that C<< $c->action >> methods such as
426 L<name|Catalyst::Action/name>, L<class|Catalyst::Action/class> and
427 L<reverse|Catalyst::Action/reverse> return information for the visited action
428 when they are invoked within the visited action. This is different from the
429 behavior of L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, which
430 continues to use the $c->action object from the caller action even when
431 invoked from the callee.
433 C<< $c->stash >> is kept unchanged.
435 In effect, L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >>
436 allows you to "wrap" another action, just as it would have been called by
437 dispatching from a URL, while the analogous
438 L<< go|/"$c->go( $action [, \@captures, \@arguments ] )" >> allows you to
439 transfer control to another action as if it had been reached directly from a URL.
443 sub visit { my $c = shift; $c->dispatcher->visit( $c, @_ ) }
445 =head2 $c->go( $action [, \@captures, \@arguments ] )
447 =head2 $c->go( $class, $method, [, \@captures, \@arguments ] )
449 The relationship between C<go> and
450 L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> is the same as
451 the relationship between
452 L<< forward|/"$c->forward( $class, $method, [, \@arguments ] )" >> and
453 L<< detach|/"$c->detach( $action [, \@arguments ] )" >>. Like C<< $c->visit >>,
454 C<< $c->go >> will perform a full dispatch on the specified action or method,
455 with localized C<< $c->action >> and C<< $c->namespace >>. Like C<detach>,
456 C<go> escapes the processing of the current request chain on completion, and
457 does not return to its caller.
459 @arguments are arguments to the final destination of $action. @captures are
460 arguments to the intermediate steps, if any, on the way to the final sub of
465 sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) }
471 Returns the current L<Catalyst::Response> object, see there for details.
475 Returns a hashref to the stash, which may be used to store data and pass
476 it between components during a request. You can also set hash keys by
477 passing arguments. The stash is automatically sent to the view. The
478 stash is cleared at the end of a request; it cannot be used for
479 persistent storage (for this you must use a session; see
480 L<Catalyst::Plugin::Session> for a complete system integrated with
483 $c->stash->{foo} = $bar;
484 $c->stash( { moose => 'majestic', qux => 0 } );
485 $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
487 # stash is automatically passed to the view for use in a template
488 $c->forward( 'MyApp::View::TT' );
492 around stash => sub {
495 my $stash = $orig->($c);
497 my $new_stash = @_ > 1 ? {@_} : $_[0];
498 croak('stash takes a hash or hashref') unless ref $new_stash;
499 foreach my $key ( keys %$new_stash ) {
500 $stash->{$key} = $new_stash->{$key};
510 =head2 $c->error($error, ...)
512 =head2 $c->error($arrayref)
514 Returns an arrayref containing error messages. If Catalyst encounters an
515 error while processing a request, it stores the error in $c->error. This
516 method should only be used to store fatal error messages.
518 my @error = @{ $c->error };
522 $c->error('Something bad happened');
529 my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
530 croak @$error unless ref $c;
531 push @{ $c->{error} }, @$error;
533 elsif ( defined $_[0] ) { $c->{error} = undef }
534 return $c->{error} || [];
540 Contains the return value of the last executed action.
541 Note that << $c->state >> operates in a scalar context which means that all
542 values it returns are scalar.
544 =head2 $c->clear_errors
546 Clear errors. You probably don't want to clear the errors unless you are
547 implementing a custom error screen.
549 This is equivalent to running
560 =head2 COMPONENT ACCESSORS
562 =head2 $c->controller($name)
564 Gets a L<Catalyst::Controller> instance by name.
566 $c->controller('Foo')->do_stuff;
568 If the name is omitted, will return the controller for the dispatched
571 If you want to search for controllers, pass in a regexp as the argument.
573 # find all controllers that start with Foo
574 my @foo_controllers = $c->controller(qr{^Foo});
579 sub controller { shift->_lookup_mvc('controller', @_) }
581 =head2 $c->model($name)
583 Gets a L<Catalyst::Model> instance by name.
585 $c->model('Foo')->do_stuff;
587 Any extra arguments are directly passed to ACCEPT_CONTEXT.
589 If the name is omitted, it will look for
590 - a model object in $c->stash->{current_model_instance}, then
591 - a model name in $c->stash->{current_model}, then
592 - a config setting 'default_model', or
593 - check if there is only one model, and return it if that's the case.
595 If you want to search for models, pass in a regexp as the argument.
597 # find all models that start with Foo
598 my @foo_models = $c->model(qr{^Foo});
602 sub model { shift->_lookup_mvc('model', @_) }
604 =head2 $c->view($name)
606 Gets a L<Catalyst::View> instance by name.
608 $c->view('Foo')->do_stuff;
610 Any extra arguments are directly passed to ACCEPT_CONTEXT.
612 If the name is omitted, it will look for
613 - a view object in $c->stash->{current_view_instance}, then
614 - a view name in $c->stash->{current_view}, then
615 - a config setting 'default_view', or
616 - check if there is only one view, and return it if that's the case.
618 If you want to search for views, pass in a regexp as the argument.
620 # find all views that start with Foo
621 my @foo_views = $c->view(qr{^Foo});
625 sub view { shift->_lookup_mvc('view', @_) }
628 my ( $c, $type, $name, @args ) = @_;
630 if (ref $c && !$name) {
631 my $current_instance = $c->stash->{"current_${type}_instance"};
632 return $current_instance
633 if $current_instance && $type ne 'controller';
635 $name = $type eq 'controller'
636 ? Catalyst::Utils::class2classshortsuffix($c->action->class)
637 : $c->stash->{"current_${type}"}
641 return $c->container->get_component_from_sub_container($type, $name, $c, @args);
644 =head2 $c->controllers
646 Returns the available names which can be passed to $c->controller
652 return $c->container->get_sub_container('controller')->get_service_list;
657 Returns the available names which can be passed to $c->model
663 return $c->container->get_sub_container('model')->get_service_list;
669 Returns the available names which can be passed to $c->view
675 return $c->container->get_sub_container('view')->get_service_list;
678 =head2 $c->comp($name)
680 =head2 $c->component($name)
682 Gets a component object by name. This method is not recommended,
683 unless you want to get a specific component by full
684 class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
685 should be used instead.
687 If C<$name> is a regexp, a list of components matched against the full
688 component name will be returned.
693 my ( $c, $component, @args ) = @_;
695 unless ($component) {
696 $c->log->warn('Calling $c->component with no args is deprecated and ');
697 $c->log->warn('will be removed in a future release.');
698 $c->log->warn('Use $c->component_list instead.');
699 return $c->component_list;
702 my @result = $c->container->find_component( $component, $c, @args );
704 # list context for regexp searches
705 return @result if ref $component;
707 # only one component (if it's found) for string searches
708 return shift @result if @result;
710 if (ref $c eq $component) {
711 $c->log->warn('You are calling $c->comp("MyApp"). This behaviour is');
712 $c->log->warn('deprecated, and will be removed in a future release.');
716 $c->log->warn("Looking for '$component', but nothing was found.");
718 # I would expect to return an empty list here, but that breaks back-compat
719 $c->log->warn('Component not found, returning the list of existing');
720 $c->log->warn('components. This behavior is deprecated and will be');
721 $c->log->warn('removed in a future release. Use $c->component_list');
722 $c->log->warn('instead.');
724 return $c->component_list;
727 =head2 $c->component_list
729 Returns the sorted list of the component names of the application.
733 sub component_list { sort keys %{ shift->components } }
735 =head2 CLASS DATA AND HELPER CLASSES
739 Returns or takes a hashref containing the application's configuration.
741 __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
743 You can also use a C<YAML>, C<XML> or L<Config::General> config file
744 like C<myapp.conf> in your applications home directory. See
745 L<Catalyst::Plugin::ConfigLoader>.
747 =head3 Cascading configuration
749 The config method is present on all Catalyst components, and configuration
750 will be merged when an application is started. Configuration loaded with
751 L<Catalyst::Plugin::ConfigLoader> takes precedence over other configuration,
752 followed by configuration in your top level C<MyApp> class. These two
753 configurations are merged, and then configuration data whose hash key matches a
754 component name is merged with configuration for that component.
756 The configuration for a component is then passed to the C<new> method when a
757 component is constructed.
761 MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
762 MyApp::Model::Foo->config({ quux => 'frob', overrides => 'this' });
764 will mean that C<MyApp::Model::Foo> receives the following data when
767 MyApp::Model::Foo->new({
773 It's common practice to use a Moose attribute
774 on the receiving component to access the config value.
776 package MyApp::Model::Foo;
780 # this attr will receive 'baz' at construction time
786 You can then get the value 'baz' by calling $c->model('Foo')->bar
787 (or $self->bar inside code in the model).
789 B<NOTE:> you MUST NOT call C<< $self->config >> or C<< __PACKAGE__->config >>
790 as a way of reading config within your code, as this B<will not> give you the
791 correctly merged config back. You B<MUST> take the config values supplied to
792 the constructor and use those instead.
796 around config => sub {
800 croak('Setting config after setup has been run is not allowed.')
801 if ( @_ and $c->setup_finished );
808 Returns the logging object instance. Unless it is already set, Catalyst
809 sets this up with a L<Catalyst::Log> object. To use your own log class,
810 set the logger with the C<< __PACKAGE__->log >> method prior to calling
811 C<< __PACKAGE__->setup >>.
813 __PACKAGE__->log( MyLogger->new );
818 $c->log->info( 'Now logging with my own logger!' );
820 Your log class should implement the methods described in
826 Returns 1 if debug mode is enabled, 0 otherwise.
828 You can enable debug mode in several ways:
832 =item By calling myapp_server.pl with the -d flag
834 =item With the environment variables MYAPP_DEBUG, or CATALYST_DEBUG
836 =item The -Debug option in your MyApp.pm
838 =item By declaring C<sub debug { 1 }> in your MyApp.pm.
842 The first three also set the log level to 'debug'.
844 Calling C<< $c->debug(1) >> has no effect.
850 =head2 $c->dispatcher
852 Returns the dispatcher instance. See L<Catalyst::Dispatcher>.
856 Returns the engine instance. See L<Catalyst::Engine>.
859 =head2 UTILITY METHODS
861 =head2 $c->path_to(@path)
863 Merges C<@path> with C<< $c->config->{home} >> and returns a
864 L<Path::Class::Dir> object. Note you can usually use this object as
865 a filename, but sometimes you will have to explicitly stringify it
866 yourself by calling the C<< ->stringify >> method.
870 $c->path_to( 'db', 'sqlite.db' );
875 my ( $c, @path ) = @_;
876 my $path = Path::Class::Dir->new( $c->config->{home}, @path );
877 if ( -d $path ) { return $path }
878 else { return Path::Class::File->new( $c->config->{home}, @path ) }
881 =head2 $c->plugin( $name, $class, @args )
883 Helper method for plugins. It creates a class data accessor/mutator and
884 loads and instantiates the given class.
886 MyApp->plugin( 'prototype', 'HTML::Prototype' );
888 $c->prototype->define_javascript_functions;
890 B<Note:> This method of adding plugins is deprecated. The ability
891 to add plugins like this B<will be removed> in a Catalyst 5.81.
892 Please do not use this functionality in new code.
897 my ( $class, $name, $plugin, @args ) = @_;
899 # See block comment in t/aggregate/unit_core_plugin.t
900 $class->log->warn(qq/Adding plugin using the ->plugin method is deprecated, and will be removed in Catalyst 5.81/);
902 $class->_register_plugin( $plugin, 1 );
904 eval { $plugin->import };
905 $class->mk_classdata($name);
907 eval { $obj = $plugin->new(@args) };
910 Catalyst::Exception->throw( message =>
911 qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
915 $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
921 Initializes the dispatcher and engine, loads any plugins, and loads the
922 model, view, and controller components. You may also specify an array
923 of plugins to load here, if you choose to not load them in the C<use
927 MyApp->setup( qw/-Debug/ );
932 my ( $class, @arguments ) = @_;
933 croak('Running setup more than once')
934 if ( $class->setup_finished );
936 unless ( $class->isa('Catalyst') ) {
938 Catalyst::Exception->throw(
939 message => qq/'$class' does not inherit from Catalyst/ );
942 if ( $class->arguments ) {
943 @arguments = ( @arguments, @{ $class->arguments } );
949 foreach (@arguments) {
953 ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
955 elsif (/^-(\w+)=?(.*)$/) {
956 $flags->{ lc $1 } = $2;
959 push @{ $flags->{plugins} }, $_;
963 $class->setup_config();
964 $class->setup_home( delete $flags->{home} );
966 $class->setup_log( delete $flags->{log} );
967 $class->setup_plugins( delete $flags->{plugins} );
968 $class->setup_dispatcher( delete $flags->{dispatcher} );
969 if (my $engine = delete $flags->{engine}) {
970 $class->log->warn("Specifying the engine in ->setup is no longer supported, see Catalyst::Upgrading");
972 $class->setup_engine();
973 $class->setup_stats( delete $flags->{stats} );
975 for my $flag ( sort keys %{$flags} ) {
977 if ( my $code = $class->can( 'setup_' . $flag ) ) {
978 &$code( $class, delete $flags->{$flag} );
981 $class->log->warn(qq/Unknown flag "$flag"/);
985 eval { require Catalyst::Devel; };
986 if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
987 $class->log->warn(<<"EOF");
988 You are running an old script!
990 Please update by running (this will overwrite existing files):
991 catalyst.pl -force -scripts $class
993 or (this will not overwrite existing files):
994 catalyst.pl -scripts $class
999 if ( $class->debug ) {
1000 my @plugins = map { "$_ " . ( $_->VERSION || '' ) } $class->registered_plugins;
1003 my $column_width = Catalyst::Utils::term_width() - 6;
1004 my $t = Text::SimpleTable->new($column_width);
1005 $t->row($_) for @plugins;
1006 $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
1009 my $dispatcher = $class->dispatcher;
1010 my $engine = $class->engine;
1011 my $home = $class->config->{home};
1013 $class->log->debug(sprintf(q/Loaded dispatcher "%s"/, blessed($dispatcher)));
1014 $class->log->debug(sprintf(q/Loaded engine "%s"/, blessed($engine)));
1018 ? $class->log->debug(qq/Found home "$home"/)
1019 : $class->log->debug(qq/Home "$home" doesn't exist/)
1020 : $class->log->debug(q/Couldn't find home/);
1023 # Call plugins setup, this is stupid and evil.
1024 # Also screws C3 badly on 5.10, hack to avoid.
1026 no warnings qw/redefine/;
1027 local *setup = sub { };
1028 $class->setup unless $Catalyst::__AM_RESTARTING;
1031 $class->setup_components;
1035 my $comps = $class->container->get_all_components($class)
1037 my $column_width = Catalyst::Utils::term_width() - 8 - 9;
1038 my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] );
1039 $t->row( $_ => ref($comps->{$_}) ? 'instance' : 'class' ) for keys %$comps;
1041 $class->log->debug( "Loaded components:\n" . $t->draw . "\n" );
1044 $class->setup_actions;
1046 if ( $class->debug ) {
1047 my $name = $class->config->{name} || 'Application';
1048 $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
1051 # Make sure that the application class becomes immutable at this point,
1052 B::Hooks::EndOfScope::on_scope_end {
1054 my $meta = Class::MOP::get_metaclass_by_name($class);
1057 && ! { $meta->immutable_options }->{replace_constructor}
1059 $class->isa('Class::Accessor::Fast')
1060 || $class->isa('Class::Accessor')
1063 warn "You made your application class ($class) immutable, "
1064 . "but did not inline the\nconstructor. "
1065 . "This will break catalyst, as your app \@ISA "
1066 . "Class::Accessor(::Fast)?\nPlease pass "
1067 . "(replace_constructor => 1)\nwhen making your class immutable.\n";
1069 $meta->make_immutable(
1070 replace_constructor => 1,
1071 ) unless $meta->is_immutable;
1074 if ($class->config->{case_sensitive}) {
1075 $class->log->warn($class . "->config->{case_sensitive} is set.");
1076 $class->log->warn("This setting is deprecated and planned to be removed in Catalyst 5.81.");
1079 $class->setup_finalize;
1080 # Should be the last thing we do so that user things hooking
1081 # setup_finalize can log..
1082 $class->log->_flush() if $class->log->can('_flush');
1083 return 1; # Explicit return true as people have __PACKAGE__->setup as the last thing in their class. HATE.
1086 =head2 $app->setup_finalize
1088 A hook to attach modifiers to. This method does not do anything except set the
1089 C<setup_finished> accessor.
1091 Applying method modifiers to the C<setup> method doesn't work, because of quirky things done for plugin setup.
1095 after setup_finalize => sub {
1103 sub setup_finalize {
1105 $class->setup_finished(1);
1108 =head2 $c->uri_for( $path?, @args?, \%query_values? )
1110 =head2 $c->uri_for( $action, \@captures?, @args?, \%query_values? )
1112 Constructs an absolute L<URI> object based on the application root, the
1113 provided path, and the additional arguments and query parameters provided.
1114 When used as a string, provides a textual URI. If you need more flexibility
1115 than this (i.e. the option to provide relative URIs etc.) see
1116 L<Catalyst::Plugin::SmartURI>.
1118 If no arguments are provided, the URI for the current action is returned.
1119 To return the current action and also provide @args, use
1120 C<< $c->uri_for( $c->action, @args ) >>.
1122 If the first argument is a string, it is taken as a public URI path relative
1123 to C<< $c->namespace >> (if it doesn't begin with a forward slash) or
1124 relative to the application root (if it does). It is then merged with
1125 C<< $c->request->base >>; any C<@args> are appended as additional path
1126 components; and any C<%query_values> are appended as C<?foo=bar> parameters.
1128 If the first argument is a L<Catalyst::Action> it represents an action which
1129 will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The
1130 optional C<\@captures> argument (an arrayref) allows passing the captured
1131 variables that are needed to fill in the paths of Chained and Regex actions;
1132 once the path is resolved, C<uri_for> continues as though a path was
1133 provided, appending any arguments or parameters and creating an absolute
1136 The captures for the current request can be found in
1137 C<< $c->request->captures >>, and actions can be resolved using
1138 C<< Catalyst::Controller->action_for($name) >>. If you have a private action
1139 path, use C<< $c->uri_for_action >> instead.
1141 # Equivalent to $c->req->uri
1142 $c->uri_for($c->action, $c->req->captures,
1143 @{ $c->req->args }, $c->req->params);
1145 # For the Foo action in the Bar controller
1146 $c->uri_for($c->controller('Bar')->action_for('Foo'));
1148 # Path to a static resource
1149 $c->uri_for('/static/images/logo.png');
1154 my ( $c, $path, @args ) = @_;
1156 if (blessed($path) && $path->isa('Catalyst::Controller')) {
1157 $path = $path->path_prefix;
1162 undef($path) if (defined $path && $path eq '');
1165 ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
1167 carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
1168 foreach my $arg (@args) {
1169 utf8::encode($arg) if utf8::is_utf8($arg);
1170 $arg =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1173 if ( blessed($path) ) { # action object
1174 s|/|%2F|g for @args;
1175 my $captures = [ map { s|/|%2F|g; $_; }
1176 ( scalar @args && ref $args[0] eq 'ARRAY'
1180 foreach my $capture (@$captures) {
1181 utf8::encode($capture) if utf8::is_utf8($capture);
1182 $capture =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1186 $path = $c->dispatcher->uri_for_action($action, $captures);
1187 if (not defined $path) {
1188 $c->log->debug(qq/Can't find uri_for action '$action' @$captures/)
1192 $path = '/' if $path eq '';
1195 unshift(@args, $path);
1197 unless (defined $path && $path =~ s!^/!!) { # in-place strip
1198 my $namespace = $c->namespace;
1199 if (defined $path) { # cheesy hack to handle path '../foo'
1200 $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
1202 unshift(@args, $namespace || '');
1205 # join args with '/', or a blank string
1206 my $args = join('/', grep { defined($_) } @args);
1207 $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
1209 my $base = $c->req->base;
1210 my $class = ref($base);
1211 $base =~ s{(?<!/)$}{/};
1215 if (my @keys = keys %$params) {
1216 # somewhat lifted from URI::_query's query_form
1217 $query = '?'.join('&', map {
1218 my $val = $params->{$_};
1219 s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go;
1222 $val = '' unless defined $val;
1225 utf8::encode( $param ) if utf8::is_utf8($param);
1226 # using the URI::Escape pattern here so utf8 chars survive
1227 $param =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1229 "${key}=$param"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
1233 my $res = bless(\"${base}${args}${query}", $class);
1237 =head2 $c->uri_for_action( $path, \@captures?, @args?, \%query_values? )
1239 =head2 $c->uri_for_action( $action, \@captures?, @args?, \%query_values? )
1245 A private path to the Catalyst action you want to create a URI for.
1247 This is a shortcut for calling C<< $c->dispatcher->get_action_by_path($path)
1248 >> and passing the resulting C<$action> and the remaining arguments to C<<
1251 You can also pass in a Catalyst::Action object, in which case it is passed to
1254 Note that although the path looks like a URI that dispatches to the wanted action, it is not a URI, but an internal path to that action.
1256 For example, if the action looks like:
1258 package MyApp::Controller::Users;
1260 sub lst : Path('the-list') {}
1264 $c->uri_for_action('/users/lst')
1266 and it will create the URI /users/the-list.
1272 sub uri_for_action {
1273 my ( $c, $path, @args ) = @_;
1274 my $action = blessed($path)
1276 : $c->dispatcher->get_action_by_path($path);
1277 unless (defined $action) {
1278 croak "Can't find action for path '$path'";
1280 return $c->uri_for( $action, @args );
1283 =head2 $c->welcome_message
1285 Returns the Catalyst welcome HTML page.
1289 sub welcome_message {
1291 my $name = $c->config->{name};
1292 my $logo = $c->uri_for('/static/images/catalyst_logo.png');
1293 my $prefix = Catalyst::Utils::appprefix( ref $c );
1294 $c->response->content_type('text/html; charset=utf-8');
1296 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1297 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1298 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1300 <meta http-equiv="Content-Language" content="en" />
1301 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1302 <title>$name on Catalyst $VERSION</title>
1303 <style type="text/css">
1306 background-color: #eee;
1313 margin-bottom: 10px;
1315 background-color: #ccc;
1316 border: 1px solid #aaa;
1321 font-family: verdana, tahoma, sans-serif;
1324 font-family: verdana, tahoma, sans-serif;
1327 text-decoration: none;
1329 border-bottom: 1px dotted #bbb;
1331 :link:hover, :visited:hover {
1344 background-color: #fff;
1345 border: 1px solid #aaa;
1349 font-weight: normal;
1371 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1376 <img src="$logo" alt="Catalyst Logo" />
1378 <p>Welcome to the world of Catalyst.
1379 This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1380 framework will make web development something you had
1381 never expected it to be: Fun, rewarding, and quick.</p>
1382 <h2>What to do now?</h2>
1383 <p>That really depends on what <b>you</b> want to do.
1384 We do, however, provide you with a few starting points.</p>
1385 <p>If you want to jump right into web development with Catalyst
1386 you might want to start with a tutorial.</p>
1387 <pre>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Tutorial.pod">Catalyst::Manual::Tutorial</a></code>
1389 <p>Afterwards you can go on to check out a more complete look at our features.</p>
1391 <code>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod">Catalyst::Manual::Intro</a>
1392 <!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1394 <h2>What to do next?</h2>
1395 <p>Next it's time to write an actual application. Use the
1396 helper scripts to generate <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AController%3A%3A&mode=all">controllers</a>,
1397 <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AModel%3A%3A&mode=all">models</a>, and
1398 <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AView%3A%3A&mode=all">views</a>;
1399 they can save you a lot of work.</p>
1400 <pre><code>script/${prefix}_create.pl --help</code></pre>
1401 <p>Also, be sure to check out the vast and growing
1402 collection of <a href="http://search.cpan.org/search?query=Catalyst">plugins for Catalyst on CPAN</a>;
1403 you are likely to find what you need there.
1407 <p>Catalyst has a very active community. Here are the main places to
1408 get in touch with us.</p>
1411 <a href="http://dev.catalyst.perl.org">Wiki</a>
1414 <a href="http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst">Mailing-List</a>
1417 <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1420 <h2>In conclusion</h2>
1421 <p>The Catalyst team hopes you will enjoy using Catalyst as much
1422 as we enjoyed making it. Please contact us if you have ideas
1423 for improvement or other feedback.</p>
1431 =head1 INTERNAL METHODS
1433 These methods are not meant to be used by end users.
1435 =head2 $c->components
1437 Returns a hash of components.
1442 my ( $class, $comps ) = @_;
1444 # people create components calling this sub directly, before setup
1445 $class->setup_config unless $class->container;
1447 my $container = $class->container;
1450 $container->add_component( $_ ) for keys %$comps;
1453 return $container->get_all_components($class);
1456 =head2 $c->context_class
1458 Returns or sets the context class.
1462 Returns a hashref containing coderefs and execution counts (needed for
1463 deep recursion detection).
1467 Returns the number of actions on the current internal execution stack.
1471 Dispatches a request to actions.
1475 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
1477 =head2 $c->dispatcher_class
1479 Returns or sets the dispatcher class.
1481 =head2 $c->dump_these
1483 Returns a list of 2-element array references (name, structure) pairs
1484 that will be dumped on the error page in debug mode.
1490 [ Request => $c->req ],
1491 [ Response => $c->res ],
1492 [ Stash => $c->stash ],
1493 [ Config => $c->config ];
1496 =head2 $c->engine_class
1498 Returns or sets the engine class.
1500 =head2 $c->execute( $class, $coderef )
1502 Execute a coderef in given class and catch exceptions. Errors are available
1508 my ( $c, $class, $code ) = @_;
1509 $class = $c->component($class) || $class;
1512 if ( $c->depth >= $RECURSION ) {
1513 my $action = $code->reverse();
1514 $action = "/$action" unless $action =~ /->/;
1515 my $error = qq/Deep recursion detected calling "${action}"/;
1516 $c->log->error($error);
1522 my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
1524 push( @{ $c->stack }, $code );
1526 no warnings 'recursion';
1527 # N.B. This used to be combined, but I have seen $c get clobbered if so, and
1528 # I have no idea how, ergo $ret (which appears to fix the issue)
1529 eval { my $ret = $code->execute( $class, $c, @{ $c->req->args } ) || 0; $c->state( $ret ) };
1531 $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
1533 my $last = pop( @{ $c->stack } );
1535 if ( my $error = $@ ) {
1536 if ( blessed($error) and $error->isa('Catalyst::Exception::Detach') ) {
1537 $error->rethrow if $c->depth > 1;
1539 elsif ( blessed($error) and $error->isa('Catalyst::Exception::Go') ) {
1540 $error->rethrow if $c->depth > 0;
1543 unless ( ref $error ) {
1544 no warnings 'uninitialized';
1546 my $class = $last->class;
1547 my $name = $last->name;
1548 $error = qq/Caught exception in $class->$name "$error"/;
1557 sub _stats_start_execute {
1558 my ( $c, $code ) = @_;
1559 my $appclass = ref($c) || $c;
1560 return if ( ( $code->name =~ /^_.*/ )
1561 && ( !$appclass->config->{show_internal_actions} ) );
1563 my $action_name = $code->reverse();
1564 $c->counter->{$action_name}++;
1566 my $action = $action_name;
1567 $action = "/$action" unless $action =~ /->/;
1569 # determine if the call was the result of a forward
1570 # this is done by walking up the call stack and looking for a calling
1571 # sub of Catalyst::forward before the eval
1573 for my $index ( 2 .. 11 ) {
1575 if ( ( caller($index) )[0] eq 'Catalyst'
1576 && ( caller($index) )[3] eq '(eval)' );
1578 if ( ( caller($index) )[3] =~ /forward$/ ) {
1579 $callsub = ( caller($index) )[3];
1580 $action = "-> $action";
1585 my $uid = $action_name . $c->counter->{$action_name};
1587 # is this a root-level call or a forwarded call?
1588 if ( $callsub =~ /forward$/ ) {
1589 my $parent = $c->stack->[-1];
1591 # forward, locate the caller
1592 if ( defined $parent && exists $c->counter->{"$parent"} ) {
1595 parent => "$parent" . $c->counter->{"$parent"},
1601 # forward with no caller may come from a plugin
1620 sub _stats_finish_execute {
1621 my ( $c, $info ) = @_;
1622 $c->stats->profile( end => $info );
1627 Finalizes the request.
1634 for my $error ( @{ $c->error } ) {
1635 $c->log->error($error);
1638 # Allow engine to handle finalize flow (for POE)
1639 my $engine = $c->engine;
1640 if ( my $code = $engine->can('finalize') ) {
1645 $c->finalize_uploads;
1648 if ( $#{ $c->error } >= 0 ) {
1652 $c->finalize_headers;
1655 if ( $c->request->method eq 'HEAD' ) {
1656 $c->response->body('');
1664 if ($c->use_stats) {
1665 my $elapsed = sprintf '%f', $c->stats->elapsed;
1666 my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
1668 "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );
1671 return $c->response->status;
1674 =head2 $c->finalize_body
1680 sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
1682 =head2 $c->finalize_cookies
1688 sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
1690 =head2 $c->finalize_error
1696 sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) }
1698 =head2 $c->finalize_headers
1704 sub finalize_headers {
1707 my $response = $c->response; #accessor calls can add up?
1709 # Check if we already finalized headers
1710 return if $response->finalized_headers;
1713 if ( my $location = $response->redirect ) {
1714 $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
1715 $response->header( Location => $location );
1717 if ( !$response->has_body ) {
1718 # Add a default body if none is already present
1720 qq{<html><body><p>This item has moved <a href="$location">here</a>.</p></body></html>}
1726 if ( defined $response->body && length $response->body && !$response->content_length ) {
1728 # get the length from a filehandle
1729 if ( blessed( $response->body ) && $response->body->can('read') || ref( $response->body ) eq 'GLOB' )
1731 my $size = -s $response->body;
1733 $response->content_length( $size );
1736 $c->log->warn('Serving filehandle without a content-length');
1740 # everything should be bytes at this point, but just in case
1741 $response->content_length( length( $response->body ) );
1746 if ( $response->status =~ /^(1\d\d|[23]04)$/ ) {
1747 $response->headers->remove_header("Content-Length");
1748 $response->body('');
1751 $c->finalize_cookies;
1753 $c->engine->finalize_headers( $c, @_ );
1756 $response->finalized_headers(1);
1759 =head2 $c->finalize_output
1761 An alias for finalize_body.
1763 =head2 $c->finalize_read
1765 Finalizes the input after reading is complete.
1769 sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
1771 =head2 $c->finalize_uploads
1773 Finalizes uploads. Cleans up any temporary files.
1777 sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
1779 =head2 $c->get_action( $action, $namespace )
1781 Gets an action in a given namespace.
1785 sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
1787 =head2 $c->get_actions( $action, $namespace )
1789 Gets all actions of a given name in a namespace and all parent
1794 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
1796 =head2 $app->handle_request( @arguments )
1798 Called to handle each HTTP request.
1802 sub handle_request {
1803 my ( $class, @arguments ) = @_;
1805 # Always expect worst case!
1808 if ($class->debug) {
1809 my $secs = time - $START || 1;
1810 my $av = sprintf '%.3f', $COUNT / $secs;
1811 my $time = localtime time;
1812 $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
1815 my $c = $class->prepare(@arguments);
1817 $status = $c->finalize;
1820 chomp(my $error = $_);
1821 $class->log->error(qq/Caught exception in engine "$error"/);
1826 if(my $coderef = $class->log->can('_flush')){
1827 $class->log->$coderef();
1832 =head2 $c->prepare( @arguments )
1834 Creates a Catalyst context from an engine-specific request (Apache, CGI,
1840 my ( $class, @arguments ) = @_;
1843 # After the app/ctxt split, this should become an attribute based on something passed
1844 # into the application.
1845 $class->context_class( ref $class || $class ) unless $class->context_class;
1847 my $c = $class->context_class->new({});
1849 # For on-demand data
1850 $c->request->_context($c);
1851 $c->response->_context($c);
1853 #surely this is not the most efficient way to do things...
1854 $c->stats($class->stats_class->new)->enable($c->use_stats);
1855 if ( $c->debug || $c->config->{enable_catalyst_header} ) {
1856 $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
1860 # Allow engine to direct the prepare flow (for POE)
1861 if ( my $prepare = $c->engine->can('prepare') ) {
1862 $c->engine->$prepare( $c, @arguments );
1865 $c->prepare_request(@arguments);
1866 $c->prepare_connection;
1867 $c->prepare_query_parameters;
1868 $c->prepare_headers;
1869 $c->prepare_cookies;
1872 # Prepare the body for reading, either by prepare_body
1873 # or the user, if they are using $c->read
1876 # Parse the body unless the user wants it on-demand
1877 unless ( ref($c)->config->{parse_on_demand} ) {
1882 # VERY ugly and probably shouldn't rely on ->finalize actually working
1884 # failed prepare is always due to an invalid request, right?
1885 $c->response->status(400);
1886 $c->response->content_type('text/plain');
1887 $c->response->body('Bad Request');
1892 my $method = $c->req->method || '';
1893 my $path = $c->req->path;
1894 $path = '/' unless length $path;
1895 my $address = $c->req->address || '';
1904 =head2 $c->prepare_action
1906 Prepares action. See L<Catalyst::Dispatcher>.
1910 sub prepare_action { my $c = shift; $c->dispatcher->prepare_action( $c, @_ ) }
1912 =head2 $c->prepare_body
1914 Prepares message body.
1921 return if $c->request->_has_body;
1923 # Initialize on-demand data
1924 $c->engine->prepare_body( $c, @_ );
1925 $c->prepare_parameters;
1926 $c->prepare_uploads;
1929 =head2 $c->prepare_body_chunk( $chunk )
1931 Prepares a chunk of data before sending it to L<HTTP::Body>.
1933 See L<Catalyst::Engine>.
1937 sub prepare_body_chunk {
1939 $c->engine->prepare_body_chunk( $c, @_ );
1942 =head2 $c->prepare_body_parameters
1944 Prepares body parameters.
1948 sub prepare_body_parameters {
1950 $c->engine->prepare_body_parameters( $c, @_ );
1953 =head2 $c->prepare_connection
1955 Prepares connection.
1959 sub prepare_connection {
1961 $c->engine->prepare_connection( $c, @_ );
1964 =head2 $c->prepare_cookies
1970 sub prepare_cookies { my $c = shift; $c->engine->prepare_cookies( $c, @_ ) }
1972 =head2 $c->prepare_headers
1978 sub prepare_headers { my $c = shift; $c->engine->prepare_headers( $c, @_ ) }
1980 =head2 $c->prepare_parameters
1982 Prepares parameters.
1986 sub prepare_parameters {
1988 $c->prepare_body_parameters;
1989 $c->engine->prepare_parameters( $c, @_ );
1992 =head2 $c->prepare_path
1994 Prepares path and base.
1998 sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
2000 =head2 $c->prepare_query_parameters
2002 Prepares query parameters.
2006 sub prepare_query_parameters {
2009 $c->engine->prepare_query_parameters( $c, @_ );
2012 =head2 $c->log_request
2014 Writes information about the request to the debug logs. This includes:
2018 =item * Request method, path, and remote IP address
2020 =item * Query keywords (see L<Catalyst::Request/query_keywords>)
2022 =item * Request parameters
2024 =item * File uploads
2033 return unless $c->debug;
2035 my($dump) = grep {$_->[0] eq 'Request' } $c->dump_these;
2036 my $request = $dump->[1];
2038 my ( $method, $path, $address ) = ( $request->method, $request->path, $request->address );
2040 $path = '/' unless length $path;
2042 $c->log->debug(qq/"$method" request for "$path" from "$address"/);
2044 $c->log_request_headers($request->headers);
2046 if ( my $keywords = $request->query_keywords ) {
2047 $c->log->debug("Query keywords are: $keywords");
2050 $c->log_request_parameters( query => $request->query_parameters, $request->_has_body ? (body => $request->body_parameters) : () );
2052 $c->log_request_uploads($request);
2055 =head2 $c->log_response
2057 Writes information about the response to the debug logs by calling
2058 C<< $c->log_response_status_line >> and C<< $c->log_response_headers >>.
2065 return unless $c->debug;
2067 my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these;
2068 my $response = $dump->[1];
2070 $c->log_response_status_line($response);
2071 $c->log_response_headers($response->headers);
2074 =head2 $c->log_response_status_line($response)
2076 Writes one line of information about the response to the debug logs. This includes:
2080 =item * Response status code
2082 =item * Content-Type header (if present)
2084 =item * Content-Length header (if present)
2090 sub log_response_status_line {
2091 my ($c, $response) = @_;
2095 'Response Code: %s; Content-Type: %s; Content-Length: %s',
2096 $response->status || 'unknown',
2097 $response->headers->header('Content-Type') || 'unknown',
2098 $response->headers->header('Content-Length') || 'unknown'
2103 =head2 $c->log_response_headers($headers);
2105 Hook method which can be wrapped by plugins to log the responseheaders.
2106 No-op in the default implementation.
2110 sub log_response_headers {}
2112 =head2 $c->log_request_parameters( query => {}, body => {} )
2114 Logs request parameters to debug logs
2118 sub log_request_parameters {
2120 my %all_params = @_;
2122 return unless $c->debug;
2124 my $column_width = Catalyst::Utils::term_width() - 44;
2125 foreach my $type (qw(query body)) {
2126 my $params = $all_params{$type};
2127 next if ! keys %$params;
2128 my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] );
2129 for my $key ( sort keys %$params ) {
2130 my $param = $params->{$key};
2131 my $value = defined($param) ? $param : '';
2132 $t->row( $key, ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
2134 $c->log->debug( ucfirst($type) . " Parameters are:\n" . $t->draw );
2138 =head2 $c->log_request_uploads
2140 Logs file uploads included in the request to the debug logs.
2141 The parameter name, filename, file type, and file size are all included in
2146 sub log_request_uploads {
2148 my $request = shift;
2149 return unless $c->debug;
2150 my $uploads = $request->uploads;
2151 if ( keys %$uploads ) {
2152 my $t = Text::SimpleTable->new(
2153 [ 12, 'Parameter' ],
2158 for my $key ( sort keys %$uploads ) {
2159 my $upload = $uploads->{$key};
2160 for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
2161 $t->row( $key, $u->filename, $u->type, $u->size );
2164 $c->log->debug( "File Uploads are:\n" . $t->draw );
2168 =head2 $c->log_request_headers($headers);
2170 Hook method which can be wrapped by plugins to log the request headers.
2171 No-op in the default implementation.
2175 sub log_request_headers {}
2177 =head2 $c->log_headers($type => $headers)
2179 Logs L<HTTP::Headers> (either request or response) to the debug logs.
2186 my $headers = shift; # an HTTP::Headers instance
2188 return unless $c->debug;
2190 my $column_width = Catalyst::Utils::term_width() - 28;
2191 my $t = Text::SimpleTable->new( [ 15, 'Header Name' ], [ $column_width, 'Value' ] );
2194 my ( $name, $value ) = @_;
2195 $t->row( $name, $value );
2198 $c->log->debug( ucfirst($type) . " Headers:\n" . $t->draw );
2202 =head2 $c->prepare_read
2204 Prepares the input for reading.
2208 sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
2210 =head2 $c->prepare_request
2212 Prepares the engine request.
2216 sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
2218 =head2 $c->prepare_uploads
2224 sub prepare_uploads {
2227 $c->engine->prepare_uploads( $c, @_ );
2230 =head2 $c->prepare_write
2232 Prepares the output for writing.
2236 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
2238 =head2 $c->request_class
2240 Returns or sets the request class. Defaults to L<Catalyst::Request>.
2242 =head2 $c->response_class
2244 Returns or sets the response class. Defaults to L<Catalyst::Response>.
2246 =head2 $c->read( [$maxlength] )
2248 Reads a chunk of data from the request body. This method is designed to
2249 be used in a while loop, reading C<$maxlength> bytes on every call.
2250 C<$maxlength> defaults to the size of the request if not specified.
2252 You have to set C<< MyApp->config(parse_on_demand => 1) >> to use this
2255 Warning: If you use read(), Catalyst will not process the body,
2256 so you will not be able to access POST parameters or file uploads via
2257 $c->request. You must handle all body parsing yourself.
2261 sub read { my $c = shift; return $c->engine->read( $c, @_ ) }
2271 $app->engine_loader->needs_psgi_engine_compat_hack ?
2272 $app->engine->run($app, @_) :
2273 $app->engine->run( $app, $app->_finalized_psgi_app, @_ );
2276 =head2 $c->set_action( $action, $code, $namespace, $attrs )
2278 Sets an action in a given namespace.
2282 sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
2284 =head2 $c->setup_actions($component)
2286 Sets up actions for a component.
2290 sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
2292 =head2 $c->setup_config
2299 my %args = %{ $class->config || {} };
2301 my $container_class;
2303 if ( exists $args{container_class} ) {
2304 $container_class = delete $args{container_class};
2305 Class::MOP::load_class($container_class);
2308 $container_class = Class::MOP::load_first_existing_class("${class}::Container", 'Catalyst::IOC::Container');
2311 my $container = $container_class->new( %args, application_name => "$class", name => "$class" );
2312 $class->container($container);
2314 my $config = $container->resolve( service => 'config' );
2315 $class->config($config);
2316 $class->finalize_config; # back-compat
2319 =head2 $c->finalize_config
2323 sub finalize_config { }
2325 =head2 $c->setup_components
2327 This method is called internally to set up the application's components.
2329 It finds modules by calling the L<locate_components> method, expands them to
2330 package names with the $container->expand_component_module method, and then
2331 installs each component into the application.
2333 The C<setup_components> config option is passed to both of the above methods.
2337 sub setup_components { shift->container->setup_components }
2339 =head2 locate_components
2343 # FIXME - removed locate_components
2344 # don't people mess with this method directly?
2345 # what to do with that?
2347 sub locate_components {
2350 $class->log->warn('The locate_components method has been deprecated.');
2351 $class->log->warn('Please read Catalyst::IOC::Container documentation to');
2352 $class->log->warn('update your application.');
2354 # XXX think about ditching this sort entirely
2355 return sort { length $a <=> length $b }
2356 @{ $class->container->resolve( service => 'locate_components' ) };
2359 =head2 $c->setup_dispatcher
2365 sub setup_dispatcher {
2366 my ( $class, $dispatcher ) = @_;
2369 $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
2372 if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
2373 $dispatcher = 'Catalyst::Dispatcher::' . $env;
2376 unless ($dispatcher) {
2377 $dispatcher = $class->dispatcher_class;
2380 Class::MOP::load_class($dispatcher);
2382 # dispatcher instance
2383 $class->dispatcher( $dispatcher->new );
2386 =head2 $c->setup_engine
2393 my ($class, $requested_engine) = @_;
2395 if (!$class->engine_loader || $requested_engine) {
2396 $class->engine_loader(
2397 Catalyst::EngineLoader->new({
2398 application_name => $class,
2399 (defined $requested_engine
2400 ? (requested_engine => $requested_engine) : ()),
2404 $class->engine_loader->catalyst_engine_class;
2408 my ($class, $requested_engine) = @_;
2410 my $engine = $class->engine_class($requested_engine);
2412 # Don't really setup_engine -- see _setup_psgi_app for explanation.
2413 return if $class->loading_psgi_file;
2415 Class::MOP::load_class($engine);
2417 if ($ENV{MOD_PERL}) {
2418 my $apache = $class->engine_loader->auto;
2420 my $meta = find_meta($class);
2421 my $was_immutable = $meta->is_immutable;
2422 my %immutable_options = $meta->immutable_options;
2423 $meta->make_mutable if $was_immutable;
2425 $meta->add_method(handler => sub {
2427 my $psgi_app = $class->psgi_app;
2428 $apache->call_app($r, $psgi_app);
2431 $meta->make_immutable(%immutable_options) if $was_immutable;
2434 $class->engine( $engine->new );
2439 sub _finalized_psgi_app {
2442 unless ($app->_psgi_app) {
2443 my $psgi_app = $app->_setup_psgi_app;
2444 $app->_psgi_app($psgi_app);
2447 return $app->_psgi_app;
2450 sub _setup_psgi_app {
2453 for my $home (Path::Class::Dir->new($app->config->{home})) {
2454 my $psgi_file = $home->file(
2455 Catalyst::Utils::appprefix($app) . '.psgi',
2458 next unless -e $psgi_file;
2460 # If $psgi_file calls ->setup_engine, it's doing so to load
2461 # Catalyst::Engine::PSGI. But if it does that, we're only going to
2462 # throw away the loaded PSGI-app and load the 5.9 Catalyst::Engine
2463 # anyway. So set a flag (ick) that tells setup_engine not to populate
2464 # $c->engine or do any other things we might regret.
2466 $app->loading_psgi_file(1);
2467 my $psgi_app = Plack::Util::load_psgi($psgi_file);
2468 $app->loading_psgi_file(0);
2471 unless $app->engine_loader->needs_psgi_engine_compat_hack;
2474 Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.
2476 Its content has been ignored. Please consult the Catalyst::Upgrading
2477 documentation on how to upgrade from Catalyst::Engine::PSGI.
2481 return $app->apply_default_middlewares($app->psgi_app);
2484 =head2 $c->apply_default_middlewares
2486 Adds the following L<Plack> middlewares to your application, since they are
2487 useful and commonly needed:
2489 L<Plack::Middleware::ReverseProxy>, (conditionally added based on the status
2490 of your $ENV{REMOTE_ADDR}, and can be forced on with C<using_frontend_proxy>
2491 or forced off with C<ignore_frontend_proxy>), L<Plack::Middleware::LighttpdScriptNameFix>
2492 (if you are using Lighttpd), L<Plack::Middleware::IIS6ScriptNameFix> (always
2493 applied since this middleware is smart enough to conditionally apply itself).
2495 Additionally if we detect we are using Nginx, we add a bit of custom middleware
2496 to solve some problems with the way that server handles $ENV{PATH_INFO} and
2502 sub apply_default_middlewares {
2503 my ($app, $psgi_app) = @_;
2505 $psgi_app = Plack::Middleware::Conditional->wrap(
2507 builder => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) },
2510 return if $app->config->{ignore_frontend_proxy};
2511 return $env->{REMOTE_ADDR} eq '127.0.0.1'
2512 || $app->config->{using_frontend_proxy};
2516 my $server_matches = sub {
2520 my $server = $env->{SERVER_SOFTWARE};
2521 return unless $server;
2522 return $server =~ $re ? 1 : 0;
2526 # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
2527 # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
2528 $psgi_app = Plack::Middleware::LighttpdScriptNameFix->wrap($psgi_app);
2530 # we're applying this unconditionally as the middleware itself already makes
2531 # sure it doesn't fuck things up if it's not running under one of the right
2533 $psgi_app = Plack::Middleware::IIS6ScriptNameFix->wrap($psgi_app);
2540 Returns a PSGI application code reference for the catalyst application
2541 C<$c>. This is the bare application without any middlewares
2542 applied. C<${myapp}.psgi> is not taken into account.
2544 This is what you want to be using to retrieve the PSGI application code
2545 reference of your Catalyst application for use in F<.psgi> files.
2551 return $app->engine->build_psgi_app($app);
2554 =head2 $c->setup_home
2556 Sets up the home directory.
2561 my ( $class, $home ) = @_;
2563 if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
2567 $home ||= Catalyst::Utils::home($class);
2570 #I remember recently being scolded for assigning config values like this
2571 $class->config->{home} ||= $home;
2572 $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
2576 =head2 $c->setup_log
2578 Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and
2579 passing it to C<log()>. Pass in a comma-delimited list of levels to set the
2582 This method also installs a C<debug> method that returns a true value into the
2583 catalyst subclass if the "debug" level is passed in the comma-delimited list,
2584 or if the C<$CATALYST_DEBUG> environment variable is set to a true value.
2586 Note that if the log has already been setup, by either a previous call to
2587 C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>,
2588 that this method won't actually set up the log object.
2593 my ( $class, $levels ) = @_;
2596 $levels =~ s/^\s+//;
2597 $levels =~ s/\s+$//;
2598 my %levels = map { $_ => 1 } split /\s*,\s*/, $levels;
2600 my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
2601 if ( defined $env_debug ) {
2602 $levels{debug} = 1 if $env_debug; # Ugly!
2603 delete($levels{debug}) unless $env_debug;
2606 unless ( $class->log ) {
2607 $class->log( Catalyst::Log->new(keys %levels) );
2610 if ( $levels{debug} ) {
2611 Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
2612 $class->log->debug('Debug messages enabled');
2616 =head2 $c->setup_plugins
2622 =head2 $c->setup_stats
2624 Sets up timing statistics class.
2629 my ( $class, $stats ) = @_;
2631 Catalyst::Utils::ensure_class_loaded($class->stats_class);
2633 my $env = Catalyst::Utils::env_value( $class, 'STATS' );
2634 if ( defined($env) ? $env : ($stats || $class->debug ) ) {
2635 Class::MOP::get_metaclass_by_name($class)->add_method('use_stats' => sub { 1 });
2636 $class->log->debug('Statistics enabled');
2641 =head2 $c->registered_plugins
2643 Returns a sorted list of the plugins which have either been stated in the
2644 import list or which have been added via C<< MyApp->plugin(@args); >>.
2646 If passed a given plugin name, it will report a boolean value indicating
2647 whether or not that plugin is loaded. A fully qualified name is required if
2648 the plugin name does not begin with C<Catalyst::Plugin::>.
2650 if ($c->registered_plugins('Some::Plugin')) {
2658 sub registered_plugins {
2660 return sort keys %{ $proto->_plugins } unless @_;
2662 return 1 if exists $proto->_plugins->{$plugin};
2663 return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
2666 sub _register_plugin {
2667 my ( $proto, $plugin, $instant ) = @_;
2668 my $class = ref $proto || $proto;
2670 Class::MOP::load_class( $plugin );
2671 $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is deprecated and will not work in 5.81" )
2672 if $plugin->isa( 'Catalyst::Component' );
2673 $proto->_plugins->{$plugin} = 1;
2675 my $meta = Class::MOP::get_metaclass_by_name($class);
2676 $meta->superclasses($plugin, $meta->superclasses);
2682 my ( $class, $plugins ) = @_;
2684 $class->_plugins( {} ) unless $class->_plugins;
2685 $plugins = Data::OptList::mkopt($plugins || []);
2688 [ Catalyst::Utils::resolve_namespace(
2689 $class . '::Plugin',
2690 'Catalyst::Plugin', $_->[0]
2696 for my $plugin ( reverse @plugins ) {
2697 Class::MOP::load_class($plugin->[0], $plugin->[1]);
2698 my $meta = find_meta($plugin->[0]);
2699 next if $meta && $meta->isa('Moose::Meta::Role');
2701 $class->_register_plugin($plugin->[0]);
2705 map { $_->[0]->name, $_->[1] }
2706 grep { blessed($_->[0]) && $_->[0]->isa('Moose::Meta::Role') }
2707 map { [find_meta($_->[0]), $_->[1]] }
2710 Moose::Util::apply_all_roles(
2718 Returns an arrayref of the internal execution stack (actions that are
2719 currently executing).
2723 Returns the current timing statistics object. By default Catalyst uses
2724 L<Catalyst::Stats|Catalyst::Stats>, but can be set otherwise with
2725 L<< stats_class|/"$c->stats_class" >>.
2727 Even if L<< -Stats|/"-Stats" >> is not enabled, the stats object is still
2728 available. By enabling it with C< $c->stats->enabled(1) >, it can be used to
2729 profile explicitly, although MyApp.pm still won't profile nor output anything
2732 =head2 $c->stats_class
2734 Returns or sets the stats (timing statistics) class. L<Catalyst::Stats|Catalyst::Stats> is used by default.
2736 =head2 $c->use_stats
2738 Returns 1 when L<< stats collection|/"-Stats" >> is enabled.
2740 Note that this is a static method, not an accessor and should be overridden
2741 by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
2748 =head2 $c->write( $data )
2750 Writes $data to the output stream. When using this method directly, you
2751 will need to manually set the C<Content-Length> header to the length of
2752 your output data, if known.
2759 # Finalize headers if someone manually writes output
2760 $c->finalize_headers;
2762 return $c->engine->write( $c, @_ );
2767 Returns the Catalyst version number. Mostly useful for "powered by"
2768 messages in template systems.
2772 sub version { return $Catalyst::VERSION }
2774 =head1 CONFIGURATION
2776 There are a number of 'base' config variables which can be set:
2782 C<default_model> - The default model picked if you say C<< $c->model >>. See L<< /$c->model($name) >>.
2786 C<default_view> - The default view to be rendered or returned when C<< $c->view >> is called. See L<< /$c->view($name) >>.
2790 C<home> - The application home directory. In an uninstalled application,
2791 this is the top level application directory. In an installed application,
2792 this will be the directory containing C<< MyApp.pm >>.
2796 C<ignore_frontend_proxy> - See L</PROXY SUPPORT>
2800 C<name> - The name of the application in debug messages and the debug and
2805 C<parse_on_demand> - The request body (for example file uploads) will not be parsed
2806 until it is accessed. This allows you to (for example) check authentication (and reject
2807 the upload) before actually recieving all the data. See L</ON-DEMAND PARSER>
2811 C<root> - The root directory for templates. Usually this is just a
2812 subdirectory of the home directory, but you can set it to change the
2813 templates to a different directory.
2817 C<show_internal_actions> - If true, causes internal actions such as C<< _DISPATCH >>
2818 to be shown in hit debug tables in the test server.
2822 C<use_request_uri_for_path> - Controlls if the C<REQUEST_URI> or C<PATH_INFO> environment
2823 variable should be used for determining the request path.
2825 Most web server environments pass the requested path to the application using environment variables,
2826 from which Catalyst has to reconstruct the request base (i.e. the top level path to / in the application,
2827 exposed as C<< $c->request->base >>) and the request path below that base.
2829 There are two methods of doing this, both of which have advantages and disadvantages. Which method is used
2830 is determined by the C<< $c->config(use_request_uri_for_path) >> setting (which can either be true or false).
2834 =item use_request_uri_for_path => 0
2836 This is the default (and the) traditional method that Catalyst has used for determining the path information.
2837 The path is synthesised from a combination of the C<PATH_INFO> and C<SCRIPT_NAME> environment variables.
2838 The allows the application to behave correctly when C<mod_rewrite> is being used to redirect requests
2839 into the application, as these variables are adjusted by mod_rewrite to take account for the redirect.
2841 However this method has the major disadvantage that it is impossible to correctly decode some elements
2842 of the path, as RFC 3875 says: "C<< Unlike a URI path, the PATH_INFO is not URL-encoded, and cannot
2843 contain path-segment parameters. >>" This means PATH_INFO is B<always> decoded, and therefore Catalyst
2844 can't distinguish / vs %2F in paths (in addition to other encoded values).
2846 =item use_request_uri_for_path => 1
2848 This method uses the C<REQUEST_URI> and C<SCRIPT_NAME> environment variables. As C<REQUEST_URI> is never
2849 decoded, this means that applications using this mode can correctly handle URIs including the %2F character
2850 (i.e. with C<AllowEncodedSlashes> set to C<On> in Apache).
2852 Given that this method of path resolution is provably more correct, it is recommended that you use
2853 this unless you have a specific need to deploy your application in a non-standard environment, and you are
2854 aware of the implications of not being able to handle encoded URI paths correctly.
2856 However it also means that in a number of cases when the app isn't installed directly at a path, but instead
2857 is having paths rewritten into it (e.g. as a .cgi/fcgi in a public_html directory, with mod_rewrite in a
2858 .htaccess file, or when SSI is used to rewrite pages into the app, or when sub-paths of the app are exposed
2859 at other URIs than that which the app is 'normally' based at with C<mod_rewrite>), the resolution of
2860 C<< $c->request->base >> will be incorrect.
2866 C<using_frontend_proxy> - See L</PROXY SUPPORT>.
2870 =head1 INTERNAL ACTIONS
2872 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
2873 C<_ACTION>, and C<_END>. These are by default not shown in the private
2874 action table, but you can make them visible with a config parameter.
2876 MyApp->config(show_internal_actions => 1);
2878 =head1 ON-DEMAND PARSER
2880 The request body is usually parsed at the beginning of a request,
2881 but if you want to handle input yourself, you can enable on-demand
2882 parsing with a config parameter.
2884 MyApp->config(parse_on_demand => 1);
2886 =head1 PROXY SUPPORT
2888 Many production servers operate using the common double-server approach,
2889 with a lightweight frontend web server passing requests to a larger
2890 backend server. An application running on the backend server must deal
2891 with two problems: the remote user always appears to be C<127.0.0.1> and
2892 the server's hostname will appear to be C<localhost> regardless of the
2893 virtual host that the user connected through.
2895 Catalyst will automatically detect this situation when you are running
2896 the frontend and backend servers on the same machine. The following
2897 changes are made to the request.
2899 $c->req->address is set to the user's real IP address, as read from
2900 the HTTP X-Forwarded-For header.
2902 The host value for $c->req->base and $c->req->uri is set to the real
2903 host, as read from the HTTP X-Forwarded-Host header.
2905 Additionally, you may be running your backend application on an insecure
2906 connection (port 80) while your frontend proxy is running under SSL. If there
2907 is a discrepancy in the ports, use the HTTP header C<X-Forwarded-Port> to
2908 tell Catalyst what port the frontend listens on. This will allow all URIs to
2909 be created properly.
2911 In the case of passing in:
2913 X-Forwarded-Port: 443
2915 All calls to C<uri_for> will result in an https link, as is expected.
2917 Obviously, your web server must support these headers for this to work.
2919 In a more complex server farm environment where you may have your
2920 frontend proxy server(s) on different machines, you will need to set a
2921 configuration option to tell Catalyst to read the proxied data from the
2924 MyApp->config(using_frontend_proxy => 1);
2926 If you do not wish to use the proxy support at all, you may set:
2928 MyApp->config(ignore_frontend_proxy => 1);
2930 =head1 THREAD SAFETY
2932 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
2933 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
2934 believe the Catalyst core to be thread-safe.
2936 If you plan to operate in a threaded environment, remember that all other
2937 modules you are using must also be thread-safe. Some modules, most notably
2938 L<DBD::SQLite>, are not thread-safe.
2944 Join #catalyst on irc.perl.org.
2948 http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
2949 http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst-dev
2953 http://catalyst.perl.org
2957 http://dev.catalyst.perl.org
2961 =head2 L<Task::Catalyst> - All you need to start with Catalyst
2963 =head2 L<Catalyst::Manual> - The Catalyst Manual
2965 =head2 L<Catalyst::Component>, L<Catalyst::Controller> - Base classes for components
2967 =head2 L<Catalyst::Engine> - Core engine
2969 =head2 L<Catalyst::Log> - Log class.
2971 =head2 L<Catalyst::Request> - Request object
2973 =head2 L<Catalyst::Response> - Response object
2975 =head2 L<Catalyst::Test> - The test suite.
2977 =head1 PROJECT FOUNDER
2979 sri: Sebastian Riedel <sri@cpan.org>
2985 acme: Leon Brocard <leon@astray.com>
2987 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
2991 Andrew Ford E<lt>A.Ford@ford-mason.co.ukE<gt>
2997 andyg: Andy Grundman <andy@hybridized.org>
2999 audreyt: Audrey Tang
3001 bricas: Brian Cassidy <bricas@cpan.org>
3003 Caelum: Rafael Kitover <rkitover@io.com>
3005 chansen: Christian Hansen
3007 chicks: Christopher Hicks
3009 Chisel Wright C<pause@herlpacker.co.uk>
3011 Danijel Milicevic C<me@danijel.de>
3013 David Kamholz E<lt>dkamholz@cpan.orgE<gt>
3015 David Naughton, C<naughton@umn.edu>
3019 dhoss: Devin Austin <dhoss@cpan.org>
3021 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
3025 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
3027 esskar: Sascha Kiefer
3029 fireartist: Carl Franks <cfranks@cpan.org>
3031 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
3033 gabb: Danijel Milicevic
3037 Gavin Henry C<ghenry@perl.me.uk>
3041 groditi: Guillermo Roditi <groditi@gmail.com>
3043 hobbs: Andrew Rodland <andrew@cleverdomain.org>
3045 ilmari: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
3047 jcamacho: Juan Camacho
3049 jester: Jesse Sheidlower C<jester@panix.com>
3051 jhannah: Jay Hannah <jay@jays.net>
3057 jon: Jon Schutz <jjschutz@cpan.org>
3059 Jonathan Rockway C<< <jrockway@cpan.org> >>
3061 Kieren Diment C<kd@totaldatasolution.com>
3063 konobi: Scott McWhirter <konobi@cpan.org>
3065 marcus: Marcus Ramberg <mramberg@cpan.org>
3067 miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
3069 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
3073 naughton: David Naughton
3075 ningu: David Kamholz <dkamholz@cpan.org>
3077 nothingmuch: Yuval Kogman <nothingmuch@woobling.org>
3079 numa: Dan Sully <daniel@cpan.org>
3085 omega: Andreas Marienborg
3087 Oleg Kostyuk <cub.uanic@gmail.com>
3089 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
3091 rafl: Florian Ragwitz <rafl@debian.org>
3093 random: Roland Lammel <lammel@cpan.org>
3095 Robert Sedlacek C<< <rs@474.at> >>
3097 SpiceMan: Marcel Montes
3101 szbalint: Balint Szilakszi <szbalint@cpan.org>
3103 t0m: Tomas Doran <bobtfish@bobtfish.net>
3107 Viljo Marrandi C<vilts@yahoo.com>
3109 Will Hawes C<info@whawes.co.uk>
3111 willert: Sebastian Willert <willert@cpan.org>
3113 wreis: Wallace Reis <wallace@reis.org.br>
3115 Yuval Kogman, C<nothingmuch@woobling.org>
3117 rainboxx: Matthias Dietrich, C<perl@rainboxx.de>
3119 dd070: Dhaval Dhanani <dhaval070@gmail.com>
3123 Copyright (c) 2005, the above named PROJECT FOUNDER and CONTRIBUTORS.
3127 This library is free software. You can redistribute it and/or modify it under
3128 the same terms as Perl itself.
3134 __PACKAGE__->meta->make_immutable;