release dev002
[catagits/Catalyst-Runtime.git] / lib / Catalyst.pm
1 package Catalyst;
2
3 use Moose;
4 use Moose::Meta::Class ();
5 extends 'Catalyst::Component';
6 use Moose::Util qw/find_meta/;
7 use namespace::clean -except => 'meta';
8 use Catalyst::Exception;
9 use Catalyst::Exception::Detach;
10 use Catalyst::Exception::Go;
11 use Catalyst::Log;
12 use Catalyst::Request;
13 use Catalyst::Request::Upload;
14 use Catalyst::Response;
15 use Catalyst::Utils;
16 use Catalyst::Controller;
17 use Data::OptList;
18 use Devel::InnerPackage ();
19 use Module::Pluggable::Object ();
20 use Text::SimpleTable ();
21 use Path::Class::Dir ();
22 use Path::Class::File ();
23 use URI ();
24 use URI::http;
25 use URI::https;
26 use HTML::Entities;
27 use Tree::Simple qw/use_weak_refs/;
28 use Tree::Simple::Visitor::FindByUID;
29 use Class::C3::Adopt::NEXT;
30 use List::MoreUtils qw/uniq/;
31 use attributes;
32 use String::RewritePrefix;
33 use Catalyst::EngineLoader;
34 use utf8;
35 use Carp qw/croak carp shortmess/;
36 use Try::Tiny;
37 use Safe::Isa;
38 use Moose::Util 'find_meta';
39 use Plack::Middleware::Conditional;
40 use Plack::Middleware::ReverseProxy;
41 use Plack::Middleware::IIS6ScriptNameFix;
42 use Plack::Middleware::IIS7KeepAliveFix;
43 use Plack::Middleware::LighttpdScriptNameFix;
44 use Plack::Middleware::ContentLength;
45 use Plack::Middleware::Head;
46 use Plack::Middleware::HTTPExceptions;
47 use Plack::Middleware::FixMissingBodyInRedirect;
48 use Plack::Middleware::MethodOverride;
49 use Plack::Middleware::RemoveRedundantBody;
50 use Catalyst::Middleware::Stash;
51 use Plack::Util;
52 use Class::Load 'load_class';
53 use Encode 2.21 'decode_utf8', 'encode_utf8';
54
55 BEGIN { require 5.008003; }
56
57 has stack => (is => 'ro', default => sub { [] });
58 has state => (is => 'rw', default => 0);
59 has stats => (is => 'rw');
60 has action => (is => 'rw');
61 has counter => (is => 'rw', default => sub { {} });
62 has request => (
63     is => 'rw',
64     default => sub {
65         my $self = shift;
66         my $class = ref $self;
67         my $composed_request_class = $class->composed_request_class;
68         return $composed_request_class->new( $self->_build_request_constructor_args);
69     },
70     lazy => 1,
71 );
72 sub _build_request_constructor_args {
73     my $self = shift;
74     my %p = ( _log => $self->log );
75     $p{_uploadtmp} = $self->_uploadtmp if $self->_has_uploadtmp;
76     $p{data_handlers} = {$self->registered_data_handlers};
77     $p{_use_hash_multivalue} = $self->config->{use_hash_multivalue_in_request}
78       if $self->config->{use_hash_multivalue_in_request};
79     \%p;
80 }
81
82 sub composed_request_class {
83   my $class = shift;
84   my @traits = (@{$class->request_class_traits||[]}, @{$class->config->{request_class_traits}||[]});
85   return $class->_composed_request_class ||
86     $class->_composed_request_class(Moose::Util::with_traits($class->request_class, @traits));
87 }
88
89 has response => (
90     is => 'rw',
91     default => sub {
92         my $self = shift;
93         my $class = ref $self;
94         my $composed_response_class = $class->composed_response_class;
95         return $composed_response_class->new( $self->_build_response_constructor_args);
96     },
97     lazy => 1,
98 );
99 sub _build_response_constructor_args {
100     return +{
101       _log => $_[0]->log,
102       encoding => $_[0]->encoding,
103     };
104 }
105
106 sub composed_response_class {
107   my $class = shift;
108   my @traits = (@{$class->response_class_traits||[]}, @{$class->config->{response_class_traits}||[]});
109   return $class->_composed_response_class ||
110     $class->_composed_response_class(Moose::Util::with_traits($class->response_class, @traits));
111 }
112
113 has namespace => (is => 'rw');
114
115 sub depth { scalar @{ shift->stack || [] }; }
116 sub comp { shift->component(@_) }
117
118 sub req {
119     my $self = shift; return $self->request(@_);
120 }
121 sub res {
122     my $self = shift; return $self->response(@_);
123 }
124
125 # For backwards compatibility
126 sub finalize_output { shift->finalize_body(@_) };
127
128 # For statistics
129 our $COUNT     = 1;
130 our $START     = time;
131 our $RECURSION = 1000;
132 our $DETACH    = Catalyst::Exception::Detach->new;
133 our $GO        = Catalyst::Exception::Go->new;
134
135 #I imagine that very few of these really need to be class variables. if any.
136 #maybe we should just make them attributes with a default?
137 __PACKAGE__->mk_classdata($_)
138   for qw/components arguments dispatcher engine log dispatcher_class
139   engine_loader context_class request_class response_class stats_class
140   setup_finished _psgi_app loading_psgi_file run_options _psgi_middleware
141   _data_handlers _encoding _encode_check finalized_default_middleware
142   request_class_traits response_class_traits stats_class_traits
143   _composed_request_class _composed_response_class _composed_stats_class/;
144
145 __PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
146 __PACKAGE__->request_class('Catalyst::Request');
147 __PACKAGE__->response_class('Catalyst::Response');
148 __PACKAGE__->stats_class('Catalyst::Stats');
149
150 sub composed_stats_class {
151   my $class = shift;
152   my @traits = (@{$class->stats_class_traits||[]}, @{$class->config->{stats_class_traits}||[]});
153   return $class->_composed_stats_class ||
154     $class->_composed_stats_class(Moose::Util::with_traits($class->stats_class, @traits));
155 }
156
157 __PACKAGE__->_encode_check(Encode::FB_CROAK | Encode::LEAVE_SRC);
158
159 # Remember to update this in Catalyst::Runtime as well!
160 our $VERSION = '5.90089_002';
161 $VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
162
163 sub import {
164     my ( $class, @arguments ) = @_;
165
166     # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
167     # callers @ISA.
168     return unless $class eq 'Catalyst';
169
170     my $caller = caller();
171     return if $caller eq 'main';
172
173     my $meta = Moose::Meta::Class->initialize($caller);
174     unless ( $caller->isa('Catalyst') ) {
175         my @superclasses = ($meta->superclasses, $class, 'Catalyst::Controller');
176         $meta->superclasses(@superclasses);
177     }
178     # Avoid possible C3 issues if 'Moose::Object' is already on RHS of MyApp
179     $meta->superclasses(grep { $_ ne 'Moose::Object' } $meta->superclasses);
180
181     unless( $meta->has_method('meta') ){
182         if ($Moose::VERSION >= 1.15) {
183             $meta->_add_meta_method('meta');
184         }
185         else {
186             $meta->add_method(meta => sub { Moose::Meta::Class->initialize("${caller}") } );
187         }
188     }
189
190     $caller->arguments( [@arguments] );
191     $caller->setup_home;
192 }
193
194 sub _application { $_[0] }
195
196 =encoding UTF-8
197
198 =head1 NAME
199
200 Catalyst - The Elegant MVC Web Application Framework
201
202 =head1 SYNOPSIS
203
204 See the L<Catalyst::Manual> distribution for comprehensive
205 documentation and tutorials.
206
207     # Install Catalyst::Devel for helpers and other development tools
208     # use the helper to create a new application
209     catalyst.pl MyApp
210
211     # add models, views, controllers
212     script/myapp_create.pl model MyDatabase DBIC::Schema create=static dbi:SQLite:/path/to/db
213     script/myapp_create.pl view MyTemplate TT
214     script/myapp_create.pl controller Search
215
216     # built in testserver -- use -r to restart automatically on changes
217     # --help to see all available options
218     script/myapp_server.pl
219
220     # command line testing interface
221     script/myapp_test.pl /yada
222
223     ### in lib/MyApp.pm
224     use Catalyst qw/-Debug/; # include plugins here as well
225
226     ### In lib/MyApp/Controller/Root.pm (autocreated)
227     sub foo : Chained('/') Args() { # called for /foo, /foo/1, /foo/1/2, etc.
228         my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
229         $c->stash->{template} = 'foo.tt'; # set the template
230         # lookup something from db -- stash vars are passed to TT
231         $c->stash->{data} =
232           $c->model('Database::Foo')->search( { country => $args[0] } );
233         if ( $c->req->params->{bar} ) { # access GET or POST parameters
234             $c->forward( 'bar' ); # process another action
235             # do something else after forward returns
236         }
237     }
238
239     # The foo.tt TT template can use the stash data from the database
240     [% WHILE (item = data.next) %]
241         [% item.foo %]
242     [% END %]
243
244     # called for /bar/of/soap, /bar/of/soap/10, etc.
245     sub bar : Chained('/') PathPart('/bar/of/soap') Args() { ... }
246
247     # called after all actions are finished
248     sub end : Action {
249         my ( $self, $c ) = @_;
250         if ( scalar @{ $c->error } ) { ... } # handle errors
251         return if $c->res->body; # already have a response
252         $c->forward( 'MyApp::View::TT' ); # render template
253     }
254
255 See L<Catalyst::Manual::Intro> for additional information.
256
257 =head1 DESCRIPTION
258
259 Catalyst is a modern framework for making web applications without the
260 pain usually associated with this process. This document is a reference
261 to the main Catalyst application. If you are a new user, we suggest you
262 start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
263
264 See L<Catalyst::Manual> for more documentation.
265
266 Catalyst plugins can be loaded by naming them as arguments to the "use
267 Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
268 plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
269 C<My::Module>.
270
271     use Catalyst qw/My::Module/;
272
273 If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
274 fully qualify the name by using a unary plus:
275
276     use Catalyst qw/
277         My::Module
278         +Fully::Qualified::Plugin::Name
279     /;
280
281 Special flags like C<-Debug> can also be specified as
282 arguments when Catalyst is loaded:
283
284     use Catalyst qw/-Debug My::Module/;
285
286 The position of plugins and flags in the chain is important, because
287 they are loaded in the order in which they appear.
288
289 The following flags are supported:
290
291 =head2 -Debug
292
293 Enables debug output. You can also force this setting from the system
294 environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
295 settings override the application, with <MYAPP>_DEBUG having the highest
296 priority.
297
298 This sets the log level to 'debug' and enables full debug output on the
299 error screen. If you only want the latter, see L<< $c->debug >>.
300
301 =head2 -Home
302
303 Forces Catalyst to use a specific home directory, e.g.:
304
305     use Catalyst qw[-Home=/usr/mst];
306
307 This can also be done in the shell environment by setting either the
308 C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
309 is replaced with the uppercased name of your application, any "::" in
310 the name will be replaced with underscores, e.g. MyApp::Web should use
311 MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
312
313 If none of these are set, Catalyst will attempt to automatically detect the
314 home directory. If you are working in a development environment, Catalyst
315 will try and find the directory containing either Makefile.PL, Build.PL,
316 dist.ini, or cpanfile. If the application has been installed into the system
317 (i.e. you have done C<make install>), then Catalyst will use the path to your
318 application module, without the .pm extension (e.g., /foo/MyApp if your
319 application was installed at /foo/MyApp.pm)
320
321 =head2 -Log
322
323     use Catalyst '-Log=warn,fatal,error';
324
325 Specifies a comma-delimited list of log levels.
326
327 =head2 -Stats
328
329 Enables statistics collection and reporting.
330
331    use Catalyst qw/-Stats=1/;
332
333 You can also force this setting from the system environment with CATALYST_STATS
334 or <MYAPP>_STATS. The environment settings override the application, with
335 <MYAPP>_STATS having the highest priority.
336
337 Stats are also enabled if L<< debugging |/"-Debug" >> is enabled.
338
339 =head1 METHODS
340
341 =head2 INFORMATION ABOUT THE CURRENT REQUEST
342
343 =head2 $c->action
344
345 Returns a L<Catalyst::Action> object for the current action, which
346 stringifies to the action name. See L<Catalyst::Action>.
347
348 =head2 $c->namespace
349
350 Returns the namespace of the current action, i.e., the URI prefix
351 corresponding to the controller of the current action. For example:
352
353     # in Controller::Foo::Bar
354     $c->namespace; # returns 'foo/bar';
355
356 =head2 $c->request
357
358 =head2 $c->req
359
360 Returns the current L<Catalyst::Request> object, giving access to
361 information about the current client request (including parameters,
362 cookies, HTTP headers, etc.). See L<Catalyst::Request>.
363
364 =head2 REQUEST FLOW HANDLING
365
366 =head2 $c->forward( $action [, \@arguments ] )
367
368 =head2 $c->forward( $class, $method, [, \@arguments ] )
369
370 This is one way of calling another action (method) in the same or
371 a different controller. You can also use C<< $self->my_method($c, @args) >>
372 in the same controller or C<< $c->controller('MyController')->my_method($c, @args) >>
373 in a different controller.
374 The main difference is that 'forward' uses some of the Catalyst request
375 cycle overhead, including debugging, which may be useful to you. On the
376 other hand, there are some complications to using 'forward', restrictions
377 on values returned from 'forward', and it may not handle errors as you prefer.
378 Whether you use 'forward' or not is up to you; it is not considered superior to
379 the other ways to call a method.
380
381 'forward' calls  another action, by its private name. If you give a
382 class name but no method, C<process()> is called. You may also optionally
383 pass arguments in an arrayref. The action will receive the arguments in
384 C<@_> and C<< $c->req->args >>. Upon returning from the function,
385 C<< $c->req->args >> will be restored to the previous values.
386
387 Any data C<return>ed from the action forwarded to, will be returned by the
388 call to forward.
389
390     my $foodata = $c->forward('/foo');
391     $c->forward('index');
392     $c->forward(qw/Model::DBIC::Foo do_stuff/);
393     $c->forward('View::TT');
394
395 Note that L<< forward|/"$c->forward( $action [, \@arguments ] )" >> implies
396 an C<< eval { } >> around the call (actually
397 L<< execute|/"$c->execute( $class, $coderef )" >> does), thus rendering all
398 exceptions thrown by the called action non-fatal and pushing them onto
399 $c->error instead. If you want C<die> to propagate you need to do something
400 like:
401
402     $c->forward('foo');
403     die join "\n", @{ $c->error } if @{ $c->error };
404
405 Or make sure to always return true values from your actions and write
406 your code like this:
407
408     $c->forward('foo') || return;
409
410 Another note is that C<< $c->forward >> always returns a scalar because it
411 actually returns $c->state which operates in a scalar context.
412 Thus, something like:
413
414     return @array;
415
416 in an action that is forwarded to is going to return a scalar,
417 i.e. how many items are in that array, which is probably not what you want.
418 If you need to return an array then return a reference to it,
419 or stash it like so:
420
421     $c->stash->{array} = \@array;
422
423 and access it from the stash.
424
425 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.
426
427 =cut
428
429 sub forward { my $c = shift; no warnings 'recursion'; $c->dispatcher->forward( $c, @_ ) }
430
431 =head2 $c->detach( $action [, \@arguments ] )
432
433 =head2 $c->detach( $class, $method, [, \@arguments ] )
434
435 =head2 $c->detach()
436
437 The same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, but
438 doesn't return to the previous action when processing is finished.
439
440 When called with no arguments it escapes the processing chain entirely.
441
442 =cut
443
444 sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
445
446 =head2 $c->visit( $action [, \@arguments ] )
447
448 =head2 $c->visit( $action [, \@captures, \@arguments ] )
449
450 =head2 $c->visit( $class, $method, [, \@arguments ] )
451
452 =head2 $c->visit( $class, $method, [, \@captures, \@arguments ] )
453
454 Almost the same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>,
455 but does a full dispatch, instead of just calling the new C<$action> /
456 C<< $class->$method >>. This means that C<begin>, C<auto> and the method
457 you go to are called, just like a new request.
458
459 In addition both C<< $c->action >> and C<< $c->namespace >> are localized.
460 This means, for example, that C<< $c->action >> methods such as
461 L<name|Catalyst::Action/name>, L<class|Catalyst::Action/class> and
462 L<reverse|Catalyst::Action/reverse> return information for the visited action
463 when they are invoked within the visited action.  This is different from the
464 behavior of L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, which
465 continues to use the $c->action object from the caller action even when
466 invoked from the called action.
467
468 C<< $c->stash >> is kept unchanged.
469
470 In effect, L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >>
471 allows you to "wrap" another action, just as it would have been called by
472 dispatching from a URL, while the analogous
473 L<< go|/"$c->go( $action [, \@captures, \@arguments ] )" >> allows you to
474 transfer control to another action as if it had been reached directly from a URL.
475
476 =cut
477
478 sub visit { my $c = shift; $c->dispatcher->visit( $c, @_ ) }
479
480 =head2 $c->go( $action [, \@arguments ] )
481
482 =head2 $c->go( $action [, \@captures, \@arguments ] )
483
484 =head2 $c->go( $class, $method, [, \@arguments ] )
485
486 =head2 $c->go( $class, $method, [, \@captures, \@arguments ] )
487
488 The relationship between C<go> and
489 L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> is the same as
490 the relationship between
491 L<< forward|/"$c->forward( $class, $method, [, \@arguments ] )" >> and
492 L<< detach|/"$c->detach( $action [, \@arguments ] )" >>. Like C<< $c->visit >>,
493 C<< $c->go >> will perform a full dispatch on the specified action or method,
494 with localized C<< $c->action >> and C<< $c->namespace >>. Like C<detach>,
495 C<go> escapes the processing of the current request chain on completion, and
496 does not return to its caller.
497
498 @arguments are arguments to the final destination of $action. @captures are
499 arguments to the intermediate steps, if any, on the way to the final sub of
500 $action.
501
502 =cut
503
504 sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) }
505
506 =head2 $c->response
507
508 =head2 $c->res
509
510 Returns the current L<Catalyst::Response> object, see there for details.
511
512 =head2 $c->stash
513
514 Returns a hashref to the stash, which may be used to store data and pass
515 it between components during a request. You can also set hash keys by
516 passing arguments. The stash is automatically sent to the view. The
517 stash is cleared at the end of a request; it cannot be used for
518 persistent storage (for this you must use a session; see
519 L<Catalyst::Plugin::Session> for a complete system integrated with
520 Catalyst).
521
522     $c->stash->{foo} = $bar;
523     $c->stash( { moose => 'majestic', qux => 0 } );
524     $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
525
526     # stash is automatically passed to the view for use in a template
527     $c->forward( 'MyApp::View::TT' );
528
529 The stash hash is currently stored in the PSGI C<$env> and is managed by
530 L<Catalyst::Middleware::Stash>.  Since it's part of the C<$env> items in
531 the stash can be accessed in sub applications mounted under your main
532 L<Catalyst> application.  For example if you delegate the response of an
533 action to another L<Catalyst> application, that sub application will have
534 access to all the stash keys of the main one, and if can of course add
535 more keys of its own.  However those new keys will not 'bubble' back up
536 to the main application.
537
538 For more information the best thing to do is to review the test case:
539 t/middleware-stash.t in the distribution /t directory.
540
541 =cut
542
543 sub stash {
544   my $c = shift;
545   return Catalyst::Middleware::Stash::get_stash($c->req->env)->(@_);
546 }
547
548 =head2 $c->error
549
550 =head2 $c->error($error, ...)
551
552 =head2 $c->error($arrayref)
553
554 Returns an arrayref containing error messages.  If Catalyst encounters an
555 error while processing a request, it stores the error in $c->error.  This
556 method should only be used to store fatal error messages.
557
558     my @error = @{ $c->error };
559
560 Add a new error.
561
562     $c->error('Something bad happened');
563
564 Calling this will always return an arrayref (if there are no errors it
565 will be an empty arrayref.
566
567 =cut
568
569 sub error {
570     my $c = shift;
571     if ( $_[0] ) {
572         my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
573         croak @$error unless ref $c;
574         push @{ $c->{error} }, @$error;
575     }
576     elsif ( defined $_[0] ) { $c->{error} = undef }
577     return $c->{error} || [];
578 }
579
580
581 =head2 $c->state
582
583 Contains the return value of the last executed action.
584 Note that << $c->state >> operates in a scalar context which means that all
585 values it returns are scalar.
586
587 =head2 $c->clear_errors
588
589 Clear errors.  You probably don't want to clear the errors unless you are
590 implementing a custom error screen.
591
592 This is equivalent to running
593
594     $c->error(0);
595
596 =cut
597
598 sub clear_errors {
599     my $c = shift;
600     $c->error(0);
601 }
602
603 =head2 $c->has_errors
604
605 Returns true if you have errors
606
607 =cut
608
609 sub has_errors { scalar(@{shift->error}) ? 1:0 }
610
611 =head2 $c->last_error
612
613 Returns the most recent error in the stack (the one most recently added...)
614 or nothing if there are no errors.
615
616 =cut
617
618 sub last_error { my ($err, @errs) = @{shift->error}; return $err }
619
620 =head2 shift_errors
621
622 shifts the most recently added error off the error stack and returns if.  Returns
623 nothing if there are no more errors.
624
625 =cut
626
627 sub shift_errors {
628     my ($self) = @_;
629     my ($err, @errors) = @{$self->error};
630     $self->{error} = \@errors;
631     return $err;
632 }
633
634 sub _comp_search_prefixes {
635     my $c = shift;
636     return map $c->components->{ $_ }, $c->_comp_names_search_prefixes(@_);
637 }
638
639 # search components given a name and some prefixes
640 sub _comp_names_search_prefixes {
641     my ( $c, $name, @prefixes ) = @_;
642     my $appclass = ref $c || $c;
643     my $filter   = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
644     $filter = qr/$filter/; # Compile regex now rather than once per loop
645
646     # map the original component name to the sub part that we will search against
647     my %eligible = map { my $n = $_; $n =~ s{^$appclass\::[^:]+::}{}; $_ => $n; }
648         grep { /$filter/ } keys %{ $c->components };
649
650     # undef for a name will return all
651     return keys %eligible if !defined $name;
652
653     my $query  = $name->$_isa('Regexp') ? $name : qr/^$name$/i;
654     my @result = grep { $eligible{$_} =~ m{$query} } keys %eligible;
655
656     return @result if @result;
657
658     # if we were given a regexp to search against, we're done.
659     return if $name->$_isa('Regexp');
660
661     # skip regexp fallback if configured
662     return
663         if $appclass->config->{disable_component_resolution_regex_fallback};
664
665     # regexp fallback
666     $query  = qr/$name/i;
667     @result = grep { $eligible{ $_ } =~ m{$query} } keys %eligible;
668
669     # no results? try against full names
670     if( !@result ) {
671         @result = grep { m{$query} } keys %eligible;
672     }
673
674     # don't warn if we didn't find any results, it just might not exist
675     if( @result ) {
676         # Disgusting hack to work out correct method name
677         my $warn_for = lc $prefixes[0];
678         my $msg = "Used regexp fallback for \$c->${warn_for}('${name}'), which found '" .
679            (join '", "', @result) . "'. Relying on regexp fallback behavior for " .
680            "component resolution is unreliable and unsafe.";
681         my $short = $result[0];
682         # remove the component namespace prefix
683         $short =~ s/.*?(Model|Controller|View):://;
684         my $shortmess = Carp::shortmess('');
685         if ($shortmess =~ m#Catalyst/Plugin#) {
686            $msg .= " You probably need to set '$short' instead of '${name}' in this " .
687               "plugin's config";
688         } elsif ($shortmess =~ m#Catalyst/lib/(View|Controller)#) {
689            $msg .= " You probably need to set '$short' instead of '${name}' in this " .
690               "component's config";
691         } else {
692            $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}('${name}'), " .
693               "but if you really wanted to search, pass in a regexp as the argument " .
694               "like so: \$c->${warn_for}(qr/${name}/)";
695         }
696         $c->log->warn( "${msg}$shortmess" );
697     }
698
699     return @result;
700 }
701
702 # Find possible names for a prefix
703 sub _comp_names {
704     my ( $c, @prefixes ) = @_;
705     my $appclass = ref $c || $c;
706
707     my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
708
709     my @names = map { s{$filter}{}; $_; }
710         $c->_comp_names_search_prefixes( undef, @prefixes );
711
712     return @names;
713 }
714
715 # Filter a component before returning by calling ACCEPT_CONTEXT if available
716
717 #our %tracker = ();
718 sub _filter_component {
719     my ( $c, $comp, @args ) = @_;
720
721     # die "Circular Dependencies Detected." if $tracker{$comp};
722     #   $tracker{$comp}++;
723     if(ref $comp eq 'CODE') {
724       $comp = $comp->($c);
725     }
726     #$tracker{$comp}++;
727
728     if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
729         return $comp->ACCEPT_CONTEXT( $c, @args );
730     }
731
732     $c->log->warn("You called component '${\$comp->catalyst_component_name}' with arguments [@args], but this component does not ACCEPT_CONTEXT, so args are ignored.") if scalar(@args) && $c->debug;
733
734     return $comp;
735 }
736
737 =head2 COMPONENT ACCESSORS
738
739 =head2 $c->controller($name)
740
741 Gets a L<Catalyst::Controller> instance by name.
742
743     $c->controller('Foo')->do_stuff;
744
745 If the name is omitted, will return the controller for the dispatched
746 action.
747
748 If you want to search for controllers, pass in a regexp as the argument.
749
750     # find all controllers that start with Foo
751     my @foo_controllers = $c->controller(qr{^Foo});
752
753
754 =cut
755
756 sub controller {
757     my ( $c, $name, @args ) = @_;
758
759     my $appclass = ref($c) || $c;
760     if( $name ) {
761         unless ( $name->$_isa('Regexp') ) { # Direct component hash lookup to avoid costly regexps
762             my $comps = $c->components;
763             my $check = $appclass."::Controller::".$name;
764             return $c->_filter_component( $comps->{$check}, @args ) if exists $comps->{$check};
765         }
766         my @result = $c->_comp_search_prefixes( $name, qw/Controller C/ );
767         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
768         return $c->_filter_component( $result[ 0 ], @args );
769     }
770
771     return $c->component( $c->action->class );
772 }
773
774 =head2 $c->model($name)
775
776 Gets a L<Catalyst::Model> instance by name.
777
778     $c->model('Foo')->do_stuff;
779
780 Any extra arguments are directly passed to ACCEPT_CONTEXT, if the model
781 defines ACCEPT_CONTEXT.  If it does not, the args are discarded.
782
783 If the name is omitted, it will look for
784  - a model object in $c->stash->{current_model_instance}, then
785  - a model name in $c->stash->{current_model}, then
786  - a config setting 'default_model', or
787  - check if there is only one model, and return it if that's the case.
788
789 If you want to search for models, pass in a regexp as the argument.
790
791     # find all models that start with Foo
792     my @foo_models = $c->model(qr{^Foo});
793
794 =cut
795
796 sub model {
797     my ( $c, $name, @args ) = @_;
798     my $appclass = ref($c) || $c;
799     if( $name ) {
800         unless ( $name->$_isa('Regexp') ) { # Direct component hash lookup to avoid costly regexps
801             my $comps = $c->components;
802             my $check = $appclass."::Model::".$name;
803             return $c->_filter_component( $comps->{$check}, @args ) if exists $comps->{$check};
804         }
805         my @result = $c->_comp_search_prefixes( $name, qw/Model M/ );
806         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
807         return $c->_filter_component( $result[ 0 ], @args );
808     }
809
810     if (ref $c) {
811         return $c->stash->{current_model_instance}
812           if $c->stash->{current_model_instance};
813         return $c->model( $c->stash->{current_model} )
814           if $c->stash->{current_model};
815     }
816     return $c->model( $appclass->config->{default_model} )
817       if $appclass->config->{default_model};
818
819     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/);
820
821     if( $rest ) {
822         $c->log->warn( Carp::shortmess('Calling $c->model() will return a random model unless you specify one of:') );
823         $c->log->warn( '* $c->config(default_model => "the name of the default model to use")' );
824         $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
825         $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
826         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
827     }
828
829     return $c->_filter_component( $comp );
830 }
831
832
833 =head2 $c->view($name)
834
835 Gets a L<Catalyst::View> instance by name.
836
837     $c->view('Foo')->do_stuff;
838
839 Any extra arguments are directly passed to ACCEPT_CONTEXT.
840
841 If the name is omitted, it will look for
842  - a view object in $c->stash->{current_view_instance}, then
843  - a view name in $c->stash->{current_view}, then
844  - a config setting 'default_view', or
845  - check if there is only one view, and return it if that's the case.
846
847 If you want to search for views, pass in a regexp as the argument.
848
849     # find all views that start with Foo
850     my @foo_views = $c->view(qr{^Foo});
851
852 =cut
853
854 sub view {
855     my ( $c, $name, @args ) = @_;
856
857     my $appclass = ref($c) || $c;
858     if( $name ) {
859         unless ( $name->$_isa('Regexp') ) { # Direct component hash lookup to avoid costly regexps
860             my $comps = $c->components;
861             my $check = $appclass."::View::".$name;
862             if( exists $comps->{$check} ) {
863                 return $c->_filter_component( $comps->{$check}, @args );
864             }
865             else {
866                 $c->log->warn( "Attempted to use view '$check', but does not exist" );
867             }
868         }
869         my @result = $c->_comp_search_prefixes( $name, qw/View V/ );
870         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
871         return $c->_filter_component( $result[ 0 ], @args );
872     }
873
874     if (ref $c) {
875         return $c->stash->{current_view_instance}
876           if $c->stash->{current_view_instance};
877         return $c->view( $c->stash->{current_view} )
878           if $c->stash->{current_view};
879     }
880     return $c->view( $appclass->config->{default_view} )
881       if $appclass->config->{default_view};
882
883     my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/View V/);
884
885     if( $rest ) {
886         $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' );
887         $c->log->warn( '* $c->config(default_view => "the name of the default view to use")' );
888         $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
889         $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
890         $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
891     }
892
893     return $c->_filter_component( $comp );
894 }
895
896 =head2 $c->controllers
897
898 Returns the available names which can be passed to $c->controller
899
900 =cut
901
902 sub controllers {
903     my ( $c ) = @_;
904     return $c->_comp_names(qw/Controller C/);
905 }
906
907 =head2 $c->models
908
909 Returns the available names which can be passed to $c->model
910
911 =cut
912
913 sub models {
914     my ( $c ) = @_;
915     return $c->_comp_names(qw/Model M/);
916 }
917
918
919 =head2 $c->views
920
921 Returns the available names which can be passed to $c->view
922
923 =cut
924
925 sub views {
926     my ( $c ) = @_;
927     return $c->_comp_names(qw/View V/);
928 }
929
930 =head2 $c->comp($name)
931
932 =head2 $c->component($name)
933
934 Gets a component object by name. This method is not recommended,
935 unless you want to get a specific component by full
936 class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
937 should be used instead.
938
939 If C<$name> is a regexp, a list of components matched against the full
940 component name will be returned.
941
942 If Catalyst can't find a component by name, it will fallback to regex
943 matching by default. To disable this behaviour set
944 disable_component_resolution_regex_fallback to a true value.
945
946     __PACKAGE__->config( disable_component_resolution_regex_fallback => 1 );
947
948 =cut
949
950 sub component {
951     my ( $c, $name, @args ) = @_;
952
953     if( $name ) {
954         my $comps = $c->components;
955
956         if( !ref $name ) {
957             # is it the exact name?
958             return $c->_filter_component( $comps->{ $name }, @args )
959                        if exists $comps->{ $name };
960
961             # perhaps we just omitted "MyApp"?
962             my $composed = ( ref $c || $c ) . "::${name}";
963             return $c->_filter_component( $comps->{ $composed }, @args )
964                        if exists $comps->{ $composed };
965
966             # search all of the models, views and controllers
967             my( $comp ) = $c->_comp_search_prefixes( $name, qw/Model M Controller C View V/ );
968             return $c->_filter_component( $comp, @args ) if $comp;
969         }
970
971         return
972             if $c->config->{disable_component_resolution_regex_fallback};
973
974         # This is here so $c->comp( '::M::' ) works
975         my $query = ref $name ? $name : qr{$name}i;
976
977         my @result = grep { m{$query} } keys %{ $c->components };
978         return map { $c->_filter_component( $_, @args ) } @result if ref $name;
979
980         if( $result[ 0 ] ) {
981             $c->log->warn( Carp::shortmess(qq(Found results for "${name}" using regexp fallback)) );
982             $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
983             $c->log->warn( 'is unreliable and unsafe. You have been warned' );
984             return $c->_filter_component( $result[ 0 ], @args );
985         }
986
987         # I would expect to return an empty list here, but that breaks back-compat
988     }
989
990     # fallback
991     return sort keys %{ $c->components };
992 }
993
994 =head2 CLASS DATA AND HELPER CLASSES
995
996 =head2 $c->config
997
998 Returns or takes a hashref containing the application's configuration.
999
1000     __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
1001
1002 You can also use a C<YAML>, C<XML> or L<Config::General> config file
1003 like C<myapp.conf> in your applications home directory. See
1004 L<Catalyst::Plugin::ConfigLoader>.
1005
1006 =head3 Cascading configuration
1007
1008 The config method is present on all Catalyst components, and configuration
1009 will be merged when an application is started. Configuration loaded with
1010 L<Catalyst::Plugin::ConfigLoader> takes precedence over other configuration,
1011 followed by configuration in your top level C<MyApp> class. These two
1012 configurations are merged, and then configuration data whose hash key matches a
1013 component name is merged with configuration for that component.
1014
1015 The configuration for a component is then passed to the C<new> method when a
1016 component is constructed.
1017
1018 For example:
1019
1020     MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
1021     MyApp::Model::Foo->config({ quux => 'frob', overrides => 'this' });
1022
1023 will mean that C<MyApp::Model::Foo> receives the following data when
1024 constructed:
1025
1026     MyApp::Model::Foo->new({
1027         bar => 'baz',
1028         quux => 'frob',
1029         overrides => 'me',
1030     });
1031
1032 It's common practice to use a Moose attribute
1033 on the receiving component to access the config value.
1034
1035     package MyApp::Model::Foo;
1036
1037     use Moose;
1038
1039     # this attr will receive 'baz' at construction time
1040     has 'bar' => (
1041         is  => 'rw',
1042         isa => 'Str',
1043     );
1044
1045 You can then get the value 'baz' by calling $c->model('Foo')->bar
1046 (or $self->bar inside code in the model).
1047
1048 B<NOTE:> you MUST NOT call C<< $self->config >> or C<< __PACKAGE__->config >>
1049 as a way of reading config within your code, as this B<will not> give you the
1050 correctly merged config back. You B<MUST> take the config values supplied to
1051 the constructor and use those instead.
1052
1053 =cut
1054
1055 around config => sub {
1056     my $orig = shift;
1057     my $c = shift;
1058
1059     croak('Setting config after setup has been run is not allowed.')
1060         if ( @_ and $c->setup_finished );
1061
1062     $c->$orig(@_);
1063 };
1064
1065 =head2 $c->log
1066
1067 Returns the logging object instance. Unless it is already set, Catalyst
1068 sets this up with a L<Catalyst::Log> object. To use your own log class,
1069 set the logger with the C<< __PACKAGE__->log >> method prior to calling
1070 C<< __PACKAGE__->setup >>.
1071
1072  __PACKAGE__->log( MyLogger->new );
1073  __PACKAGE__->setup;
1074
1075 And later:
1076
1077     $c->log->info( 'Now logging with my own logger!' );
1078
1079 Your log class should implement the methods described in
1080 L<Catalyst::Log>.
1081
1082 =head2 has_encoding
1083
1084 Returned True if there's a valid encoding
1085
1086 =head2 clear_encoding
1087
1088 Clears the encoding for the current context
1089
1090 =head2 encoding
1091
1092 Sets or gets the application encoding.  Setting encoding takes either an
1093 Encoding object or a string that we try to resolve via L<Encode::find_encoding>.
1094
1095 You would expect to get the encoding object back if you attempt to set it.  If
1096 there is a failure you will get undef returned and an error message in the log.
1097
1098 =cut
1099
1100 sub has_encoding { shift->encoding ? 1:0 }
1101
1102 sub clear_encoding {
1103     my $c = shift;
1104     if(blessed $c) {
1105         $c->encoding(undef);
1106     } else {
1107         $c->log->error("You can't clear encoding on the application");
1108     }
1109 }
1110
1111 sub encoding {
1112     my $c = shift;
1113     my $encoding;
1114
1115     if ( scalar @_ ) {
1116
1117         # Don't let one change this once we are too far into the response
1118         if(blessed $c && $c->res->finalized_headers) {
1119           Carp::croak("You may not change the encoding once the headers are finalized");
1120           return;
1121         }
1122
1123         # Let it be set to undef
1124         if (my $wanted = shift)  {
1125             $encoding = Encode::find_encoding($wanted)
1126               or Carp::croak( qq/Unknown encoding '$wanted'/ );
1127             binmode(STDERR, ':encoding(' . $encoding->name . ')');
1128         }
1129         else {
1130             binmode(STDERR);
1131         }
1132
1133         $encoding = ref $c
1134                   ? $c->{encoding} = $encoding
1135                   : $c->_encoding($encoding);
1136     } else {
1137       $encoding = ref $c && exists $c->{encoding}
1138                 ? $c->{encoding}
1139                 : $c->_encoding;
1140     }
1141
1142     return $encoding;
1143 }
1144
1145 =head2 $c->debug
1146
1147 Returns 1 if debug mode is enabled, 0 otherwise.
1148
1149 You can enable debug mode in several ways:
1150
1151 =over
1152
1153 =item By calling myapp_server.pl with the -d flag
1154
1155 =item With the environment variables MYAPP_DEBUG, or CATALYST_DEBUG
1156
1157 =item The -Debug option in your MyApp.pm
1158
1159 =item By declaring C<sub debug { 1 }> in your MyApp.pm.
1160
1161 =back
1162
1163 The first three also set the log level to 'debug'.
1164
1165 Calling C<< $c->debug(1) >> has no effect.
1166
1167 =cut
1168
1169 sub debug { 0 }
1170
1171 =head2 $c->dispatcher
1172
1173 Returns the dispatcher instance. See L<Catalyst::Dispatcher>.
1174
1175 =head2 $c->engine
1176
1177 Returns the engine instance. See L<Catalyst::Engine>.
1178
1179
1180 =head2 UTILITY METHODS
1181
1182 =head2 $c->path_to(@path)
1183
1184 Merges C<@path> with C<< $c->config->{home} >> and returns a
1185 L<Path::Class::Dir> object. Note you can usually use this object as
1186 a filename, but sometimes you will have to explicitly stringify it
1187 yourself by calling the C<< ->stringify >> method.
1188
1189 For example:
1190
1191     $c->path_to( 'db', 'sqlite.db' );
1192
1193 =cut
1194
1195 sub path_to {
1196     my ( $c, @path ) = @_;
1197     my $path = Path::Class::Dir->new( $c->config->{home}, @path );
1198     if ( -d $path ) { return $path }
1199     else { return Path::Class::File->new( $c->config->{home}, @path ) }
1200 }
1201
1202 sub plugin {
1203     my ( $class, $name, $plugin, @args ) = @_;
1204
1205     # See block comment in t/unit_core_plugin.t
1206     $class->log->warn(qq/Adding plugin using the ->plugin method is deprecated, and will be removed in a future release/);
1207
1208     $class->_register_plugin( $plugin, 1 );
1209
1210     eval { $plugin->import };
1211     $class->mk_classdata($name);
1212     my $obj;
1213     eval { $obj = $plugin->new(@args) };
1214
1215     if ($@) {
1216         Catalyst::Exception->throw( message =>
1217               qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
1218     }
1219
1220     $class->$name($obj);
1221     $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
1222       if $class->debug;
1223 }
1224
1225 =head2 MyApp->setup
1226
1227 Initializes the dispatcher and engine, loads any plugins, and loads the
1228 model, view, and controller components. You may also specify an array
1229 of plugins to load here, if you choose to not load them in the C<use
1230 Catalyst> line.
1231
1232     MyApp->setup;
1233     MyApp->setup( qw/-Debug/ );
1234
1235 B<Note:> You B<should not> wrap this method with method modifiers
1236 or bad things will happen - wrap the C<setup_finalize> method instead.
1237
1238 B<Note:> You can create a custom setup stage that will execute when the
1239 application is starting.  Use this to customize setup.
1240
1241     MyApp->setup(-Custom=value);
1242
1243     sub setup_custom {
1244       my ($class, $value) = @_;
1245     }
1246
1247 Can be handy if you want to hook into the setup phase.
1248
1249 =cut
1250
1251 sub setup {
1252     my ( $class, @arguments ) = @_;
1253     croak('Running setup more than once')
1254         if ( $class->setup_finished );
1255
1256     unless ( $class->isa('Catalyst') ) {
1257
1258         Catalyst::Exception->throw(
1259             message => qq/'$class' does not inherit from Catalyst/ );
1260     }
1261
1262     if ( $class->arguments ) {
1263         @arguments = ( @arguments, @{ $class->arguments } );
1264     }
1265
1266     # Process options
1267     my $flags = {};
1268
1269     foreach (@arguments) {
1270
1271         if (/^-Debug$/) {
1272             $flags->{log} =
1273               ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
1274         }
1275         elsif (/^-(\w+)=?(.*)$/) {
1276             $flags->{ lc $1 } = $2;
1277         }
1278         else {
1279             push @{ $flags->{plugins} }, $_;
1280         }
1281     }
1282
1283     $class->setup_home( delete $flags->{home} );
1284
1285     $class->setup_log( delete $flags->{log} );
1286     $class->setup_plugins( delete $flags->{plugins} );
1287
1288     $class->setup_data_handlers();
1289     $class->setup_dispatcher( delete $flags->{dispatcher} );
1290     if (my $engine = delete $flags->{engine}) {
1291         $class->log->warn("Specifying the engine in ->setup is no longer supported, see Catalyst::Upgrading");
1292     }
1293     $class->setup_engine();
1294     $class->setup_stats( delete $flags->{stats} );
1295
1296     for my $flag ( sort keys %{$flags} ) {
1297
1298         if ( my $code = $class->can( 'setup_' . $flag ) ) {
1299             &$code( $class, delete $flags->{$flag} );
1300         }
1301         else {
1302             $class->log->warn(qq/Unknown flag "$flag"/);
1303         }
1304     }
1305
1306     eval { require Catalyst::Devel; };
1307     if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
1308         $class->log->warn(<<"EOF");
1309 You are running an old script!
1310
1311   Please update by running (this will overwrite existing files):
1312     catalyst.pl -force -scripts $class
1313
1314   or (this will not overwrite existing files):
1315     catalyst.pl -scripts $class
1316
1317 EOF
1318     }
1319
1320     # Call plugins setup, this is stupid and evil.
1321     # Also screws C3 badly on 5.10, hack to avoid.
1322     {
1323         no warnings qw/redefine/;
1324         local *setup = sub { };
1325         $class->setup unless $Catalyst::__AM_RESTARTING;
1326     }
1327
1328     # If you are expecting configuration info as part of your setup, it needs
1329     # to get called here and below, since we need the above line to support
1330     # ConfigLoader based configs.
1331
1332     $class->setup_encoding();
1333     $class->setup_middleware();
1334
1335     # Initialize our data structure
1336     $class->components( {} );
1337
1338     $class->setup_components;
1339
1340     if ( $class->debug ) {
1341         my @plugins = map { "$_  " . ( $_->VERSION || '' ) } $class->registered_plugins;
1342
1343         if (@plugins) {
1344             my $column_width = Catalyst::Utils::term_width() - 6;
1345             my $t = Text::SimpleTable->new($column_width);
1346             $t->row($_) for @plugins;
1347             $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
1348         }
1349
1350         my @middleware = map {
1351           ref $_ eq 'CODE' ? 
1352             "Inline Coderef" : 
1353               (ref($_) .'  '. ($_->can('VERSION') ? $_->VERSION || '' : '') 
1354                 || '')  } $class->registered_middlewares;
1355
1356         if (@middleware) {
1357             my $column_width = Catalyst::Utils::term_width() - 6;
1358             my $t = Text::SimpleTable->new($column_width);
1359             $t->row($_) for @middleware;
1360             $class->log->debug( "Loaded PSGI Middleware:\n" . $t->draw . "\n" );
1361         }
1362
1363         my %dh = $class->registered_data_handlers;
1364         if (my @data_handlers = keys %dh) {
1365             my $column_width = Catalyst::Utils::term_width() - 6;
1366             my $t = Text::SimpleTable->new($column_width);
1367             $t->row($_) for @data_handlers;
1368             $class->log->debug( "Loaded Request Data Handlers:\n" . $t->draw . "\n" );
1369         }
1370
1371         my $dispatcher = $class->dispatcher;
1372         my $engine     = $class->engine;
1373         my $home       = $class->config->{home};
1374
1375         $class->log->debug(sprintf(q/Loaded dispatcher "%s"/, blessed($dispatcher)));
1376         $class->log->debug(sprintf(q/Loaded engine "%s"/, blessed($engine)));
1377
1378         $home
1379           ? ( -d $home )
1380           ? $class->log->debug(qq/Found home "$home"/)
1381           : $class->log->debug(qq/Home "$home" doesn't exist/)
1382           : $class->log->debug(q/Couldn't find home/);
1383
1384         my $column_width = Catalyst::Utils::term_width() - 8 - 9;
1385         my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] );
1386         for my $comp ( sort keys %{ $class->components } ) {
1387             my $type = ref $class->components->{$comp} ? 'instance' : 'class';
1388             $t->row( $comp, $type );
1389         }
1390         $class->log->debug( "Loaded components:\n" . $t->draw . "\n" )
1391           if ( keys %{ $class->components } );
1392     }
1393
1394     # Add our self to components, since we are also a component
1395     if( $class->isa('Catalyst::Controller') ){
1396       $class->components->{$class} = $class;
1397     }
1398
1399     $class->setup_actions;
1400
1401     if ( $class->debug ) {
1402         my $name = $class->config->{name} || 'Application';
1403         $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
1404     }
1405
1406     if ($class->config->{case_sensitive}) {
1407         $class->log->warn($class . "->config->{case_sensitive} is set.");
1408         $class->log->warn("This setting is deprecated and planned to be removed in Catalyst 5.81.");
1409     }
1410
1411     $class->setup_finalize;
1412
1413     # Flush the log for good measure (in case something turned off 'autoflush' early)
1414     $class->log->_flush() if $class->log->can('_flush');
1415
1416     return $class || 1; # Just in case someone named their Application 0...
1417 }
1418
1419 =head2 $app->setup_finalize
1420
1421 A hook to attach modifiers to. This method does not do anything except set the
1422 C<setup_finished> accessor.
1423
1424 Applying method modifiers to the C<setup> method doesn't work, because of quirky things done for plugin setup.
1425
1426 Example:
1427
1428     after setup_finalize => sub {
1429         my $app = shift;
1430
1431         ## do stuff here..
1432     };
1433
1434 =cut
1435
1436 sub setup_finalize {
1437     my ($class) = @_;
1438     $class->setup_finished(1);
1439 }
1440
1441 =head2 $c->uri_for( $path?, @args?, \%query_values? )
1442
1443 =head2 $c->uri_for( $action, \@captures?, @args?, \%query_values? )
1444
1445 =head2 $c->uri_for( $action, [@captures, @args], \%query_values? )
1446
1447 Constructs an absolute L<URI> object based on the application root, the
1448 provided path, and the additional arguments and query parameters provided.
1449 When used as a string, provides a textual URI.  If you need more flexibility
1450 than this (i.e. the option to provide relative URIs etc.) see
1451 L<Catalyst::Plugin::SmartURI>.
1452
1453 If no arguments are provided, the URI for the current action is returned.
1454 To return the current action and also provide @args, use
1455 C<< $c->uri_for( $c->action, @args ) >>.
1456
1457 If the first argument is a string, it is taken as a public URI path relative
1458 to C<< $c->namespace >> (if it doesn't begin with a forward slash) or
1459 relative to the application root (if it does). It is then merged with
1460 C<< $c->request->base >>; any C<@args> are appended as additional path
1461 components; and any C<%query_values> are appended as C<?foo=bar> parameters.
1462
1463 If the first argument is a L<Catalyst::Action> it represents an action which
1464 will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The
1465 optional C<\@captures> argument (an arrayref) allows passing the captured
1466 variables that are needed to fill in the paths of Chained and Regex actions;
1467 once the path is resolved, C<uri_for> continues as though a path was
1468 provided, appending any arguments or parameters and creating an absolute
1469 URI.
1470
1471 The captures for the current request can be found in
1472 C<< $c->request->captures >>, and actions can be resolved using
1473 C<< Catalyst::Controller->action_for($name) >>. If you have a private action
1474 path, use C<< $c->uri_for_action >> instead.
1475
1476   # Equivalent to $c->req->uri
1477   $c->uri_for($c->action, $c->req->captures,
1478       @{ $c->req->args }, $c->req->params);
1479
1480   # For the Foo action in the Bar controller
1481   $c->uri_for($c->controller('Bar')->action_for('Foo'));
1482
1483   # Path to a static resource
1484   $c->uri_for('/static/images/logo.png');
1485
1486 In general the scheme of the generated URI object will follow the incoming request
1487 however if your targeted action or action chain has the Scheme attribute it will
1488 use that instead.
1489
1490 Also, if the targeted Action or Action chain declares Args/CaptureArgs that have
1491 type constraints, we will require that your proposed URL verify on those declared
1492 constraints.
1493
1494 =cut
1495
1496 sub uri_for {
1497     my ( $c, $path, @args ) = @_;
1498
1499     if ( $path->$_isa('Catalyst::Controller') ) {
1500         $path = $path->path_prefix;
1501         $path =~ s{/+\z}{};
1502         $path .= '/';
1503     }
1504
1505     undef($path) if (defined $path && $path eq '');
1506
1507     my $params =
1508       ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
1509
1510     carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
1511
1512     my $target_action = $path->$_isa('Catalyst::Action') ? $path : undef;
1513     if ( $path->$_isa('Catalyst::Action') ) { # action object
1514         s|/|%2F|g for @args;
1515         my $captures = [ map { s|/|%2F|g; $_; }
1516                         ( scalar @args && ref $args[0] eq 'ARRAY'
1517                          ? @{ shift(@args) }
1518                          : ()) ];
1519
1520         my $action = $path;
1521         my $expanded_action = $c->dispatcher->expand_action( $action );
1522         my $num_captures = $expanded_action->number_of_captures;
1523
1524         # ->uri_for( $action, \@captures_and_args, \%query_values? )
1525         if( !@args && $action->number_of_args ) {
1526           unshift @args, splice @$captures, $num_captures;
1527         }
1528
1529         if($num_captures) {
1530           unless($expanded_action->match_captures_constraints($c, $captures)) {
1531             carp "captures [@{$captures}] do not match the type constraints in actionchain ending with '$expanded_action'";
1532             return;
1533           }
1534         }
1535
1536         $path = $c->dispatcher->uri_for_action($action, $captures);
1537         if (not defined $path) {
1538             $c->log->debug(qq/Can't find uri_for action '$action' @$captures/)
1539                 if $c->debug;
1540             return undef;
1541         }
1542         $path = '/' if $path eq '';
1543
1544         # At this point @encoded_args is the remaining Args (all captures removed).
1545         if($expanded_action->has_args_constraints) {
1546           unless($expanded_action->match_args($c,\@args)) {
1547              carp "args [@args] do not match the type constraints in action '$expanded_action'";
1548              return;
1549           }
1550         }
1551     }
1552
1553     unshift(@args, $path);
1554
1555     unless (defined $path && $path =~ s!^/!!) { # in-place strip
1556         my $namespace = $c->namespace;
1557         if (defined $path) { # cheesy hack to handle path '../foo'
1558            $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
1559         }
1560         unshift(@args, $namespace || '');
1561     }
1562
1563     # join args with '/', or a blank string
1564     my $args = join('/', grep { defined($_) } @args);
1565     $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
1566     $args =~ s!^/+!!;
1567
1568     my ($base, $class) = ('/', 'URI::_generic');
1569     if(blessed($c)) {
1570       $base = $c->req->base;
1571       if($target_action) {
1572         $target_action = $c->dispatcher->expand_action($target_action);
1573         if(my $s = $target_action->scheme) {
1574           $s = lc($s);
1575           $class = "URI::$s";
1576           $base->scheme($s);
1577         } else {
1578           $class = ref($base);
1579         }
1580       } else {
1581         $class = ref($base);
1582       }
1583
1584       $base =~ s{(?<!/)$}{/};
1585     }
1586
1587     my $query = '';
1588
1589     if (my @keys = keys %$params) {
1590       # somewhat lifted from URI::_query's query_form
1591       $query = '?'.join('&', map {
1592           my $val = $params->{$_};
1593           #s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go; ## Commented out because seems to lead to double encoding - JNAP
1594           s/ /+/g;
1595           my $key = $_;
1596           $val = '' unless defined $val;
1597           (map {
1598               my $param = "$_";
1599               $param = encode_utf8($param);
1600               # using the URI::Escape pattern here so utf8 chars survive
1601               $param =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1602               $param =~ s/ /+/g;
1603
1604               $key = encode_utf8($key);
1605               # using the URI::Escape pattern here so utf8 chars survive
1606               $key =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1607               $key =~ s/ /+/g;
1608
1609               "${key}=$param"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
1610       } @keys);
1611     }
1612
1613     $base = encode_utf8 $base;
1614     $base =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1615     $args = encode_utf8 $args;
1616     $args =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1617     
1618     my $res = bless(\"${base}${args}${query}", $class);
1619     $res;
1620 }
1621
1622 =head2 $c->uri_for_action( $path, \@captures_and_args?, @args?, \%query_values? )
1623
1624 =head2 $c->uri_for_action( $action, \@captures_and_args?, @args?, \%query_values? )
1625
1626 =over
1627
1628 =item $path
1629
1630 A private path to the Catalyst action you want to create a URI for.
1631
1632 This is a shortcut for calling C<< $c->dispatcher->get_action_by_path($path)
1633 >> and passing the resulting C<$action> and the remaining arguments to C<<
1634 $c->uri_for >>.
1635
1636 You can also pass in a Catalyst::Action object, in which case it is passed to
1637 C<< $c->uri_for >>.
1638
1639 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.
1640
1641 For example, if the action looks like:
1642
1643  package MyApp::Controller::Users;
1644
1645  sub lst : Path('the-list') {}
1646
1647 You can use:
1648
1649  $c->uri_for_action('/users/lst')
1650
1651 and it will create the URI /users/the-list.
1652
1653 =item \@captures_and_args?
1654
1655 Optional array reference of Captures (i.e. C<<CaptureArgs or $c->req->captures>)
1656 and arguments to the request. Usually used with L<Catalyst::DispatchType::Chained>
1657 to interpolate all the parameters in the URI.
1658
1659 =item @args?
1660
1661 Optional list of extra arguments - can be supplied in the
1662 C<< \@captures_and_args? >> array ref, or here - whichever is easier for your
1663 code.
1664
1665 Your action can have zero, a fixed or a variable number of args (e.g.
1666 C<< Args(1) >> for a fixed number or C<< Args() >> for a variable number)..
1667
1668 =item \%query_values?
1669
1670 Optional array reference of query parameters to append. E.g.
1671
1672   { foo => 'bar' }
1673
1674 will generate
1675
1676   /rest/of/your/uri?foo=bar
1677
1678 =back
1679
1680 =cut
1681
1682 sub uri_for_action {
1683     my ( $c, $path, @args ) = @_;
1684     my $action = blessed($path)
1685       ? $path
1686       : $c->dispatcher->get_action_by_path($path);
1687     unless (defined $action) {
1688       croak "Can't find action for path '$path'";
1689     }
1690     return $c->uri_for( $action, @args );
1691 }
1692
1693 =head2 $c->welcome_message
1694
1695 Returns the Catalyst welcome HTML page.
1696
1697 =cut
1698
1699 sub welcome_message {
1700     my $c      = shift;
1701     my $name   = $c->config->{name};
1702     my $logo   = $c->uri_for('/static/images/catalyst_logo.png');
1703     my $prefix = Catalyst::Utils::appprefix( ref $c );
1704     $c->response->content_type('text/html; charset=utf-8');
1705     return <<"EOF";
1706 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1707     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1708 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1709     <head>
1710     <meta http-equiv="Content-Language" content="en" />
1711     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1712         <title>$name on Catalyst $VERSION</title>
1713         <style type="text/css">
1714             body {
1715                 color: #000;
1716                 background-color: #eee;
1717             }
1718             div#content {
1719                 width: 640px;
1720                 margin-left: auto;
1721                 margin-right: auto;
1722                 margin-top: 10px;
1723                 margin-bottom: 10px;
1724                 text-align: left;
1725                 background-color: #ccc;
1726                 border: 1px solid #aaa;
1727             }
1728             p, h1, h2 {
1729                 margin-left: 20px;
1730                 margin-right: 20px;
1731                 font-family: verdana, tahoma, sans-serif;
1732             }
1733             a {
1734                 font-family: verdana, tahoma, sans-serif;
1735             }
1736             :link, :visited {
1737                     text-decoration: none;
1738                     color: #b00;
1739                     border-bottom: 1px dotted #bbb;
1740             }
1741             :link:hover, :visited:hover {
1742                     color: #555;
1743             }
1744             div#topbar {
1745                 margin: 0px;
1746             }
1747             pre {
1748                 margin: 10px;
1749                 padding: 8px;
1750             }
1751             div#answers {
1752                 padding: 8px;
1753                 margin: 10px;
1754                 background-color: #fff;
1755                 border: 1px solid #aaa;
1756             }
1757             h1 {
1758                 font-size: 0.9em;
1759                 font-weight: normal;
1760                 text-align: center;
1761             }
1762             h2 {
1763                 font-size: 1.0em;
1764             }
1765             p {
1766                 font-size: 0.9em;
1767             }
1768             p img {
1769                 float: right;
1770                 margin-left: 10px;
1771             }
1772             span#appname {
1773                 font-weight: bold;
1774                 font-size: 1.6em;
1775             }
1776         </style>
1777     </head>
1778     <body>
1779         <div id="content">
1780             <div id="topbar">
1781                 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1782                     $VERSION</h1>
1783              </div>
1784              <div id="answers">
1785                  <p>
1786                  <img src="$logo" alt="Catalyst Logo" />
1787                  </p>
1788                  <p>Welcome to the  world of Catalyst.
1789                     This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1790                     framework will make web development something you had
1791                     never expected it to be: Fun, rewarding, and quick.</p>
1792                  <h2>What to do now?</h2>
1793                  <p>That really depends  on what <b>you</b> want to do.
1794                     We do, however, provide you with a few starting points.</p>
1795                  <p>If you want to jump right into web development with Catalyst
1796                     you might want to start with a tutorial.</p>
1797 <pre>perldoc <a href="https://metacpan.org/module/Catalyst::Manual::Tutorial">Catalyst::Manual::Tutorial</a></code>
1798 </pre>
1799 <p>Afterwards you can go on to check out a more complete look at our features.</p>
1800 <pre>
1801 <code>perldoc <a href="https://metacpan.org/module/Catalyst::Manual::Intro">Catalyst::Manual::Intro</a>
1802 <!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1803 </code></pre>
1804                  <h2>What to do next?</h2>
1805                  <p>Next it's time to write an actual application. Use the
1806                     helper scripts to generate <a href="https://metacpan.org/search?q=Catalyst%3A%3AController">controllers</a>,
1807                     <a href="https://metacpan.org/search?q=Catalyst%3A%3AModel">models</a>, and
1808                     <a href="https://metacpan.org/search?q=Catalyst%3A%3AView">views</a>;
1809                     they can save you a lot of work.</p>
1810                     <pre><code>script/${prefix}_create.pl --help</code></pre>
1811                     <p>Also, be sure to check out the vast and growing
1812                     collection of <a href="http://search.cpan.org/search?query=Catalyst">plugins for Catalyst on CPAN</a>;
1813                     you are likely to find what you need there.
1814                     </p>
1815
1816                  <h2>Need help?</h2>
1817                  <p>Catalyst has a very active community. Here are the main places to
1818                     get in touch with us.</p>
1819                  <ul>
1820                      <li>
1821                          <a href="http://dev.catalyst.perl.org">Wiki</a>
1822                      </li>
1823                      <li>
1824                          <a href="http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst">Mailing-List</a>
1825                      </li>
1826                      <li>
1827                          <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1828                      </li>
1829                  </ul>
1830                  <h2>In conclusion</h2>
1831                  <p>The Catalyst team hopes you will enjoy using Catalyst as much
1832                     as we enjoyed making it. Please contact us if you have ideas
1833                     for improvement or other feedback.</p>
1834              </div>
1835          </div>
1836     </body>
1837 </html>
1838 EOF
1839 }
1840
1841 =head2 run_options
1842
1843 Contains a hash of options passed from the application script, including
1844 the original ARGV the script received, the processed values from that
1845 ARGV and any extra arguments to the script which were not processed.
1846
1847 This can be used to add custom options to your application's scripts
1848 and setup your application differently depending on the values of these
1849 options.
1850
1851 =head1 INTERNAL METHODS
1852
1853 These methods are not meant to be used by end users.
1854
1855 =head2 $c->components
1856
1857 Returns a hash of components.
1858
1859 =head2 $c->context_class
1860
1861 Returns or sets the context class.
1862
1863 =head2 $c->counter
1864
1865 Returns a hashref containing coderefs and execution counts (needed for
1866 deep recursion detection).
1867
1868 =head2 $c->depth
1869
1870 Returns the number of actions on the current internal execution stack.
1871
1872 =head2 $c->dispatch
1873
1874 Dispatches a request to actions.
1875
1876 =cut
1877
1878 sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
1879
1880 =head2 $c->dispatcher_class
1881
1882 Returns or sets the dispatcher class.
1883
1884 =head2 $c->dump_these
1885
1886 Returns a list of 2-element array references (name, structure) pairs
1887 that will be dumped on the error page in debug mode.
1888
1889 =cut
1890
1891 sub dump_these {
1892     my $c = shift;
1893     [ Request => $c->req ],
1894     [ Response => $c->res ],
1895     [ Stash => $c->stash ],
1896     [ Config => $c->config ];
1897 }
1898
1899 =head2 $c->engine_class
1900
1901 Returns or sets the engine class.
1902
1903 =head2 $c->execute( $class, $coderef )
1904
1905 Execute a coderef in given class and catch exceptions. Errors are available
1906 via $c->error.
1907
1908 =cut
1909
1910 sub execute {
1911     my ( $c, $class, $code ) = @_;
1912     $class = $c->component($class) || $class;
1913     $c->state(0);
1914
1915     if ( $c->depth >= $RECURSION ) {
1916         my $action = $code->reverse();
1917         $action = "/$action" unless $action =~ /->/;
1918         my $error = qq/Deep recursion detected calling "${action}"/;
1919         $c->log->error($error);
1920         $c->error($error);
1921         $c->state(0);
1922         return $c->state;
1923     }
1924
1925     my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
1926
1927     push( @{ $c->stack }, $code );
1928
1929     no warnings 'recursion';
1930     # N.B. This used to be combined, but I have seen $c get clobbered if so, and
1931     #      I have no idea how, ergo $ret (which appears to fix the issue)
1932     eval { my $ret = $code->execute( $class, $c, @{ $c->req->args } ) || 0; $c->state( $ret ) };
1933
1934     $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
1935
1936     my $last = pop( @{ $c->stack } );
1937
1938     if ( my $error = $@ ) {
1939         #rethow if this can be handled by middleware
1940         if ( $c->_handle_http_exception($error) ) {
1941             foreach my $err (@{$c->error}) {
1942                 $c->log->error($err);
1943             }
1944             $c->clear_errors;
1945             $c->log->_flush if $c->log->can('_flush');
1946
1947             $error->can('rethrow') ? $error->rethrow : croak $error;
1948         }
1949         if ( blessed($error) and $error->isa('Catalyst::Exception::Detach') ) {
1950             $error->rethrow if $c->depth > 1;
1951         }
1952         elsif ( blessed($error) and $error->isa('Catalyst::Exception::Go') ) {
1953             $error->rethrow if $c->depth > 0;
1954         }
1955         else {
1956             unless ( ref $error ) {
1957                 no warnings 'uninitialized';
1958                 chomp $error;
1959                 my $class = $last->class;
1960                 my $name  = $last->name;
1961                 $error = qq/Caught exception in $class->$name "$error"/;
1962             }
1963             $c->error($error);
1964         }
1965         $c->state(0);
1966     }
1967     return $c->state;
1968 }
1969
1970 sub _stats_start_execute {
1971     my ( $c, $code ) = @_;
1972     my $appclass = ref($c) || $c;
1973     return if ( ( $code->name =~ /^_.*/ )
1974         && ( !$appclass->config->{show_internal_actions} ) );
1975
1976     my $action_name = $code->reverse();
1977     $c->counter->{$action_name}++;
1978
1979     my $action = $action_name;
1980     $action = "/$action" unless $action =~ /->/;
1981
1982     # determine if the call was the result of a forward
1983     # this is done by walking up the call stack and looking for a calling
1984     # sub of Catalyst::forward before the eval
1985     my $callsub = q{};
1986     for my $index ( 2 .. 11 ) {
1987         last
1988         if ( ( caller($index) )[0] eq 'Catalyst'
1989             && ( caller($index) )[3] eq '(eval)' );
1990
1991         if ( ( caller($index) )[3] =~ /forward$/ ) {
1992             $callsub = ( caller($index) )[3];
1993             $action  = "-> $action";
1994             last;
1995         }
1996     }
1997
1998     my $uid = $action_name . $c->counter->{$action_name};
1999
2000     # is this a root-level call or a forwarded call?
2001     if ( $callsub =~ /forward$/ ) {
2002         my $parent = $c->stack->[-1];
2003
2004         # forward, locate the caller
2005         if ( defined $parent && exists $c->counter->{"$parent"} ) {
2006             $c->stats->profile(
2007                 begin  => $action,
2008                 parent => "$parent" . $c->counter->{"$parent"},
2009                 uid    => $uid,
2010             );
2011         }
2012         else {
2013
2014             # forward with no caller may come from a plugin
2015             $c->stats->profile(
2016                 begin => $action,
2017                 uid   => $uid,
2018             );
2019         }
2020     }
2021     else {
2022
2023         # root-level call
2024         $c->stats->profile(
2025             begin => $action,
2026             uid   => $uid,
2027         );
2028     }
2029     return $action;
2030
2031 }
2032
2033 sub _stats_finish_execute {
2034     my ( $c, $info ) = @_;
2035     $c->stats->profile( end => $info );
2036 }
2037
2038 =head2 $c->finalize
2039
2040 Finalizes the request.
2041
2042 =cut
2043
2044 sub finalize {
2045     my $c = shift;
2046
2047     for my $error ( @{ $c->error } ) {
2048         $c->log->error($error);
2049     }
2050
2051     # Support skipping finalize for psgix.io style 'jailbreak'.  Used to support
2052     # stuff like cometd and websockets
2053
2054     if($c->request->_has_io_fh) {
2055       $c->log_response;
2056       return;
2057     }
2058
2059     # Allow engine to handle finalize flow (for POE)
2060     my $engine = $c->engine;
2061     if ( my $code = $engine->can('finalize') ) {
2062         $engine->$code($c);
2063     }
2064     else {
2065
2066         $c->finalize_uploads;
2067
2068         # Error
2069         if ( $#{ $c->error } >= 0 ) {
2070             $c->finalize_error;
2071         }
2072
2073         $c->finalize_encoding;
2074         $c->finalize_headers unless $c->response->finalized_headers;
2075         $c->finalize_body;
2076     }
2077
2078     $c->log_response;
2079
2080     if ($c->use_stats) {
2081         my $elapsed = $c->stats->elapsed;
2082         my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
2083         $c->log->info(
2084             "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );
2085     }
2086
2087     return $c->response->status;
2088 }
2089
2090 =head2 $c->finalize_body
2091
2092 Finalizes body.
2093
2094 =cut
2095
2096 sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
2097
2098 =head2 $c->finalize_cookies
2099
2100 Finalizes cookies.
2101
2102 =cut
2103
2104 sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
2105
2106 =head2 $c->finalize_error
2107
2108 Finalizes error.  If there is only one error in L</error> and it is an object that
2109 does C<as_psgi> or C<code> we rethrow the error and presume it caught by middleware
2110 up the ladder.  Otherwise we return the debugging error page (in debug mode) or we
2111 return the default error page (production mode).
2112
2113 =cut
2114
2115 sub finalize_error {
2116     my $c = shift;
2117     if($#{$c->error} > 0) {
2118         $c->engine->finalize_error( $c, @_ );
2119     } else {
2120         my ($error) = @{$c->error};
2121         if ( $c->_handle_http_exception($error) ) {
2122             # In the case where the error 'knows what it wants', becauses its PSGI
2123             # aware, just rethow and let middleware catch it
2124             $error->can('rethrow') ? $error->rethrow : croak $error;
2125         } else {
2126             $c->engine->finalize_error( $c, @_ )
2127         }
2128     }
2129 }
2130
2131 =head2 $c->finalize_headers
2132
2133 Finalizes headers.
2134
2135 =cut
2136
2137 sub finalize_headers {
2138     my $c = shift;
2139
2140     my $response = $c->response; #accessor calls can add up?
2141
2142     # Check if we already finalized headers
2143     return if $response->finalized_headers;
2144
2145     # Handle redirects
2146     if ( my $location = $response->redirect ) {
2147         $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
2148         $response->header( Location => $location );
2149     }
2150
2151     # Remove incorrectly added body and content related meta data when returning
2152     # an information response, or a response the is required to not include a body
2153
2154     $c->finalize_cookies;
2155
2156     # This currently is a NOOP but I don't want to remove it since I guess people
2157     # might have Response subclasses that use it for something... (JNAP)
2158     $c->response->finalize_headers();
2159
2160     # Done
2161     $response->finalized_headers(1);
2162 }
2163
2164 =head2 $c->finalize_encoding
2165
2166 Make sure your body is encoded properly IF you set an encoding.  By
2167 default the encoding is UTF-8 but you can disable it by explicitly setting the
2168 encoding configuration value to undef.
2169
2170 We can only encode when the body is a scalar.  Methods for encoding via the
2171 streaming interfaces (such as C<write> and C<write_fh> on L<Catalyst::Response>
2172 are available).
2173
2174 See L</ENCODING>.
2175
2176 =cut
2177
2178 sub finalize_encoding {
2179     my $c = shift;
2180     my $res = $c->res || return;
2181
2182     # Warn if the set charset is different from the one you put into encoding.  We need
2183     # to do this early since encodable_response is false for this condition and we need
2184     # to match the debug output for backcompat (there's a test for this...) -JNAP
2185     if(
2186       $res->content_type_charset and $c->encoding and 
2187       (uc($c->encoding->mime_name) ne uc($res->content_type_charset))
2188     ) {
2189         my $ct = lc($res->content_type_charset);
2190         $c->log->debug("Catalyst encoding config is set to encode in '" .
2191             $c->encoding->mime_name .
2192             "', content type is '$ct', not encoding ");
2193     }
2194
2195     if(
2196       ($res->encodable_response) and
2197       (defined($res->body)) and
2198       (ref(\$res->body) eq 'SCALAR')
2199     ) {
2200         $c->res->body( $c->encoding->encode( $c->res->body, $c->_encode_check ) );
2201
2202         # Set the charset if necessary.  This might be a bit bonkers since encodable response
2203         # is false when the set charset is not the same as the encoding mimetype (maybe 
2204         # confusing action at a distance here..
2205         # Don't try to set the charset if one already exists
2206         $c->res->content_type($c->res->content_type . "; charset=" . $c->encoding->mime_name)
2207           unless($c->res->content_type_charset);
2208     }
2209 }
2210
2211 =head2 $c->finalize_output
2212
2213 An alias for finalize_body.
2214
2215 =head2 $c->finalize_read
2216
2217 Finalizes the input after reading is complete.
2218
2219 =cut
2220
2221 sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
2222
2223 =head2 $c->finalize_uploads
2224
2225 Finalizes uploads. Cleans up any temporary files.
2226
2227 =cut
2228
2229 sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
2230
2231 =head2 $c->get_action( $action, $namespace )
2232
2233 Gets an action in a given namespace.
2234
2235 =cut
2236
2237 sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
2238
2239 =head2 $c->get_actions( $action, $namespace )
2240
2241 Gets all actions of a given name in a namespace and all parent
2242 namespaces.
2243
2244 =cut
2245
2246 sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
2247
2248 =head2 $app->handle_request( @arguments )
2249
2250 Called to handle each HTTP request.
2251
2252 =cut
2253
2254 sub handle_request {
2255     my ( $class, @arguments ) = @_;
2256
2257     # Always expect worst case!
2258     my $status = -1;
2259     try {
2260         if ($class->debug) {
2261             my $secs = time - $START || 1;
2262             my $av = sprintf '%.3f', $COUNT / $secs;
2263             my $time = localtime time;
2264             $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
2265         }
2266
2267         my $c = $class->prepare(@arguments);
2268         $c->dispatch;
2269         $status = $c->finalize;
2270     } catch {
2271         #rethow if this can be handled by middleware
2272         if ( $class->_handle_http_exception($_) ) {
2273             $_->can('rethrow') ? $_->rethrow : croak $_;
2274         }
2275         chomp(my $error = $_);
2276         $class->log->error(qq/Caught exception in engine "$error"/);
2277     };
2278
2279     $COUNT++;
2280
2281     if(my $coderef = $class->log->can('_flush')){
2282         $class->log->$coderef();
2283     }
2284     return $status;
2285 }
2286
2287 =head2 $class->prepare( @arguments )
2288
2289 Creates a Catalyst context from an engine-specific request (Apache, CGI,
2290 etc.).
2291
2292 =cut
2293
2294 has _uploadtmp => (
2295     is => 'ro',
2296     predicate => '_has_uploadtmp',
2297 );
2298
2299 sub prepare {
2300     my ( $class, @arguments ) = @_;
2301
2302     # XXX
2303     # After the app/ctxt split, this should become an attribute based on something passed
2304     # into the application.
2305     $class->context_class( ref $class || $class ) unless $class->context_class;
2306
2307     my $uploadtmp = $class->config->{uploadtmp};
2308     my $c = $class->context_class->new({ $uploadtmp ? (_uploadtmp => $uploadtmp) : ()});
2309
2310     $c->response->_context($c);
2311
2312     if($c->use_stats) {
2313       $c->stats($class->composed_stats_class->new)->enable;
2314     }
2315
2316     if ( $c->debug || $c->config->{enable_catalyst_header} ) {
2317         $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
2318     }
2319
2320     try {
2321         # Allow engine to direct the prepare flow (for POE)
2322         if ( my $prepare = $c->engine->can('prepare') ) {
2323             $c->engine->$prepare( $c, @arguments );
2324         }
2325         else {
2326             $c->prepare_request(@arguments);
2327             $c->prepare_connection;
2328             $c->prepare_query_parameters;
2329             $c->prepare_headers; # Just hooks, no longer needed - they just
2330             $c->prepare_cookies; # cause the lazy attribute on req to build
2331             $c->prepare_path;
2332
2333             # Prepare the body for reading, either by prepare_body
2334             # or the user, if they are using $c->read
2335             $c->prepare_read;
2336
2337             # Parse the body unless the user wants it on-demand
2338             unless ( ref($c)->config->{parse_on_demand} ) {
2339                 $c->prepare_body;
2340             }
2341         }
2342         $c->prepare_action;
2343     }
2344     # VERY ugly and probably shouldn't rely on ->finalize actually working
2345     catch {
2346         # failed prepare is always due to an invalid request, right?
2347         $c->response->status(400);
2348         $c->response->content_type('text/plain');
2349         $c->response->body('Bad Request');
2350         # Note we call finalize and then die here, which escapes
2351         # finalize being called in the enclosing block..
2352         # It in fact couldn't be called, as we don't return $c..
2353         # This is a mess - but I'm unsure you can fix this without
2354         # breaking compat for people doing crazy things (we should set
2355         # the 400 and just return the ctx here IMO, letting finalize get called
2356         # above...
2357         $c->finalize;
2358         die $_;
2359     };
2360
2361     $c->log_request;
2362
2363     return $c;
2364 }
2365
2366 =head2 $c->prepare_action
2367
2368 Prepares action. See L<Catalyst::Dispatcher>.
2369
2370 =cut
2371
2372 sub prepare_action {
2373     my $c = shift;
2374     my $ret = $c->dispatcher->prepare_action( $c, @_);
2375
2376     if($c->encoding) {
2377         foreach (@{$c->req->arguments}, @{$c->req->captures}) {
2378           $_ = $c->_handle_param_unicode_decoding($_);
2379         }
2380     }
2381
2382     return $ret;
2383 }
2384
2385
2386 =head2 $c->prepare_body
2387
2388 Prepares message body.
2389
2390 =cut
2391
2392 sub prepare_body {
2393     my $c = shift;
2394
2395     return if $c->request->_has_body;
2396
2397     # Initialize on-demand data
2398     $c->engine->prepare_body( $c, @_ );
2399     $c->prepare_parameters;
2400     $c->prepare_uploads;
2401 }
2402
2403 =head2 $c->prepare_body_chunk( $chunk )
2404
2405 Prepares a chunk of data before sending it to L<HTTP::Body>.
2406
2407 See L<Catalyst::Engine>.
2408
2409 =cut
2410
2411 sub prepare_body_chunk {
2412     my $c = shift;
2413     $c->engine->prepare_body_chunk( $c, @_ );
2414 }
2415
2416 =head2 $c->prepare_body_parameters
2417
2418 Prepares body parameters.
2419
2420 =cut
2421
2422 sub prepare_body_parameters {
2423     my $c = shift;
2424     $c->request->prepare_body_parameters( $c, @_ );
2425 }
2426
2427 =head2 $c->prepare_connection
2428
2429 Prepares connection.
2430
2431 =cut
2432
2433 sub prepare_connection {
2434     my $c = shift;
2435     $c->request->prepare_connection($c);
2436 }
2437
2438 =head2 $c->prepare_cookies
2439
2440 Prepares cookies by ensuring that the attribute on the request
2441 object has been built.
2442
2443 =cut
2444
2445 sub prepare_cookies { my $c = shift; $c->request->cookies }
2446
2447 =head2 $c->prepare_headers
2448
2449 Prepares request headers by ensuring that the attribute on the request
2450 object has been built.
2451
2452 =cut
2453
2454 sub prepare_headers { my $c = shift; $c->request->headers }
2455
2456 =head2 $c->prepare_parameters
2457
2458 Prepares parameters.
2459
2460 =cut
2461
2462 sub prepare_parameters {
2463     my $c = shift;
2464     $c->prepare_body_parameters;
2465     $c->engine->prepare_parameters( $c, @_ );
2466 }
2467
2468 =head2 $c->prepare_path
2469
2470 Prepares path and base.
2471
2472 =cut
2473
2474 sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
2475
2476 =head2 $c->prepare_query_parameters
2477
2478 Prepares query parameters.
2479
2480 =cut
2481
2482 sub prepare_query_parameters {
2483     my $c = shift;
2484
2485     $c->engine->prepare_query_parameters( $c, @_ );
2486 }
2487
2488 =head2 $c->log_request
2489
2490 Writes information about the request to the debug logs.  This includes:
2491
2492 =over 4
2493
2494 =item * Request method, path, and remote IP address
2495
2496 =item * Query keywords (see L<Catalyst::Request/query_keywords>)
2497
2498 =item * Request parameters
2499
2500 =item * File uploads
2501
2502 =back
2503
2504 =cut
2505
2506 sub log_request {
2507     my $c = shift;
2508
2509     return unless $c->debug;
2510
2511     my($dump) = grep {$_->[0] eq 'Request' } $c->dump_these;
2512     my $request = $dump->[1];
2513
2514     my ( $method, $path, $address ) = ( $request->method, $request->path, $request->address );
2515     $method ||= '';
2516     $path = '/' unless length $path;
2517     $address ||= '';
2518
2519     $path =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
2520     $path = decode_utf8($path);
2521
2522     $c->log->debug(qq/"$method" request for "$path" from "$address"/);
2523
2524     $c->log_request_headers($request->headers);
2525
2526     if ( my $keywords = $request->query_keywords ) {
2527         $c->log->debug("Query keywords are: $keywords");
2528     }
2529
2530     $c->log_request_parameters( query => $request->query_parameters, $request->_has_body ? (body => $request->body_parameters) : () );
2531
2532     $c->log_request_uploads($request);
2533 }
2534
2535 =head2 $c->log_response
2536
2537 Writes information about the response to the debug logs by calling
2538 C<< $c->log_response_status_line >> and C<< $c->log_response_headers >>.
2539
2540 =cut
2541
2542 sub log_response {
2543     my $c = shift;
2544
2545     return unless $c->debug;
2546
2547     my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these;
2548     my $response = $dump->[1];
2549
2550     $c->log_response_status_line($response);
2551     $c->log_response_headers($response->headers);
2552 }
2553
2554 =head2 $c->log_response_status_line($response)
2555
2556 Writes one line of information about the response to the debug logs.  This includes:
2557
2558 =over 4
2559
2560 =item * Response status code
2561
2562 =item * Content-Type header (if present)
2563
2564 =item * Content-Length header (if present)
2565
2566 =back
2567
2568 =cut
2569
2570 sub log_response_status_line {
2571     my ($c, $response) = @_;
2572
2573     $c->log->debug(
2574         sprintf(
2575             'Response Code: %s; Content-Type: %s; Content-Length: %s',
2576             $response->status                            || 'unknown',
2577             $response->headers->header('Content-Type')   || 'unknown',
2578             $response->headers->header('Content-Length') || 'unknown'
2579         )
2580     );
2581 }
2582
2583 =head2 $c->log_response_headers($headers);
2584
2585 Hook method which can be wrapped by plugins to log the response headers.
2586 No-op in the default implementation.
2587
2588 =cut
2589
2590 sub log_response_headers {}
2591
2592 =head2 $c->log_request_parameters( query => {}, body => {} )
2593
2594 Logs request parameters to debug logs
2595
2596 =cut
2597
2598 sub log_request_parameters {
2599     my $c          = shift;
2600     my %all_params = @_;
2601
2602     return unless $c->debug;
2603
2604     my $column_width = Catalyst::Utils::term_width() - 44;
2605     foreach my $type (qw(query body)) {
2606         my $params = $all_params{$type};
2607         next if ! keys %$params;
2608         my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] );
2609         for my $key ( sort keys %$params ) {
2610             my $param = $params->{$key};
2611             my $value = defined($param) ? $param : '';
2612             $t->row( $key, ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
2613         }
2614         $c->log->debug( ucfirst($type) . " Parameters are:\n" . $t->draw );
2615     }
2616 }
2617
2618 =head2 $c->log_request_uploads
2619
2620 Logs file uploads included in the request to the debug logs.
2621 The parameter name, filename, file type, and file size are all included in
2622 the debug logs.
2623
2624 =cut
2625
2626 sub log_request_uploads {
2627     my $c = shift;
2628     my $request = shift;
2629     return unless $c->debug;
2630     my $uploads = $request->uploads;
2631     if ( keys %$uploads ) {
2632         my $t = Text::SimpleTable->new(
2633             [ 12, 'Parameter' ],
2634             [ 26, 'Filename' ],
2635             [ 18, 'Type' ],
2636             [ 9,  'Size' ]
2637         );
2638         for my $key ( sort keys %$uploads ) {
2639             my $upload = $uploads->{$key};
2640             for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
2641                 $t->row( $key, $u->filename, $u->type, $u->size );
2642             }
2643         }
2644         $c->log->debug( "File Uploads are:\n" . $t->draw );
2645     }
2646 }
2647
2648 =head2 $c->log_request_headers($headers);
2649
2650 Hook method which can be wrapped by plugins to log the request headers.
2651 No-op in the default implementation.
2652
2653 =cut
2654
2655 sub log_request_headers {}
2656
2657 =head2 $c->log_headers($type => $headers)
2658
2659 Logs L<HTTP::Headers> (either request or response) to the debug logs.
2660
2661 =cut
2662
2663 sub log_headers {
2664     my $c       = shift;
2665     my $type    = shift;
2666     my $headers = shift;    # an HTTP::Headers instance
2667
2668     return unless $c->debug;
2669
2670     my $column_width = Catalyst::Utils::term_width() - 28;
2671     my $t = Text::SimpleTable->new( [ 15, 'Header Name' ], [ $column_width, 'Value' ] );
2672     $headers->scan(
2673         sub {
2674             my ( $name, $value ) = @_;
2675             $t->row( $name, $value );
2676         }
2677     );
2678     $c->log->debug( ucfirst($type) . " Headers:\n" . $t->draw );
2679 }
2680
2681
2682 =head2 $c->prepare_read
2683
2684 Prepares the input for reading.
2685
2686 =cut
2687
2688 sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
2689
2690 =head2 $c->prepare_request
2691
2692 Prepares the engine request.
2693
2694 =cut
2695
2696 sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
2697
2698 =head2 $c->prepare_uploads
2699
2700 Prepares uploads.
2701
2702 =cut
2703
2704 sub prepare_uploads {
2705     my $c = shift;
2706     $c->engine->prepare_uploads( $c, @_ );
2707 }
2708
2709 =head2 $c->prepare_write
2710
2711 Prepares the output for writing.
2712
2713 =cut
2714
2715 sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
2716
2717 =head2 $c->request_class
2718
2719 Returns or sets the request class. Defaults to L<Catalyst::Request>.
2720
2721 =head2 $app->request_class_traits
2722
2723 An arrayref of L<Moose::Role>s which are applied to the request class.  
2724
2725 =head2 $app->composed_request_class
2726
2727 This is the request class which has been composed with any request_class_traits.
2728
2729 =head2 $c->response_class
2730
2731 Returns or sets the response class. Defaults to L<Catalyst::Response>.
2732
2733 =head2 $app->response_class_traits
2734
2735 An arrayref of L<Moose::Role>s which are applied to the response class.
2736
2737 =head2 $app->composed_response_class
2738
2739 This is the request class which has been composed with any response_class_traits.
2740
2741 =head2 $c->read( [$maxlength] )
2742
2743 Reads a chunk of data from the request body. This method is designed to
2744 be used in a while loop, reading C<$maxlength> bytes on every call.
2745 C<$maxlength> defaults to the size of the request if not specified.
2746
2747 You have to set C<< MyApp->config(parse_on_demand => 1) >> to use this
2748 directly.
2749
2750 Warning: If you use read(), Catalyst will not process the body,
2751 so you will not be able to access POST parameters or file uploads via
2752 $c->request.  You must handle all body parsing yourself.
2753
2754 =cut
2755
2756 sub read { my $c = shift; return $c->request->read( @_ ) }
2757
2758 =head2 $c->run
2759
2760 Starts the engine.
2761
2762 =cut
2763
2764 sub run {
2765   my $app = shift;
2766   $app->_make_immutable_if_needed;
2767   $app->engine_loader->needs_psgi_engine_compat_hack ?
2768     $app->engine->run($app, @_) :
2769       $app->engine->run( $app, $app->_finalized_psgi_app, @_ );
2770 }
2771
2772 sub _make_immutable_if_needed {
2773     my $class = shift;
2774     my $meta = find_meta($class);
2775     my $isa_ca = $class->isa('Class::Accessor::Fast') || $class->isa('Class::Accessor');
2776     if (
2777         $meta->is_immutable
2778         && ! { $meta->immutable_options }->{replace_constructor}
2779         && $isa_ca
2780     ) {
2781         warn("You made your application class ($class) immutable, "
2782             . "but did not inline the\nconstructor. "
2783             . "This will break catalyst, as your app \@ISA "
2784             . "Class::Accessor(::Fast)?\nPlease pass "
2785             . "(replace_constructor => 1)\nwhen making your class immutable.\n");
2786     }
2787     unless ($meta->is_immutable) {
2788         # XXX - FIXME warning here as you should make your app immutable yourself.
2789         $meta->make_immutable(
2790             replace_constructor => 1,
2791         );
2792     }
2793 }
2794
2795 =head2 $c->set_action( $action, $code, $namespace, $attrs )
2796
2797 Sets an action in a given namespace.
2798
2799 =cut
2800
2801 sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
2802
2803 =head2 $c->setup_actions($component)
2804
2805 Sets up actions for a component.
2806
2807 =cut
2808
2809 sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
2810
2811 =head2 $c->setup_components
2812
2813 This method is called internally to set up the application's components.
2814
2815 It finds modules by calling the L<locate_components> method, expands them to
2816 package names with the L<expand_component_module> method, and then installs
2817 each component into the application.
2818
2819 The C<setup_components> config option is passed to both of the above methods.
2820
2821 Installation of each component is performed by the L<setup_component> method,
2822 below.
2823
2824 =cut
2825
2826 sub setup_components {
2827     my $class = shift;
2828
2829     my $config  = $class->config->{ setup_components };
2830
2831     my @comps = $class->locate_components($config);
2832     my %comps = map { $_ => 1 } @comps;
2833
2834     my $deprecatedcatalyst_component_names = grep { /::[CMV]::/ } @comps;
2835     $class->log->warn(qq{Your application is using the deprecated ::[MVC]:: type naming scheme.\n}.
2836         qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n}
2837     ) if $deprecatedcatalyst_component_names;
2838
2839     for my $component ( @comps ) {
2840
2841         # We pass ignore_loaded here so that overlay files for (e.g.)
2842         # Model::DBI::Schema sub-classes are loaded - if it's in @comps
2843         # we know M::P::O found a file on disk so this is safe
2844
2845         Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
2846     }
2847
2848     for my $component (@comps) {
2849         my $instance = $class->components->{ $component } = $class->delayed_setup_component($component);
2850     }
2851
2852     # Inject a component or wrap a stand alone class in an adaptor. This makes a list
2853     # of named components in the configuration that are not actually existing (not a
2854     # real file).
2855
2856     my @injected_components = keys %{$class->config->{inject_components} ||+{}};
2857     foreach my $injected_comp_name(@injected_components) {
2858       my $component_class = $class->config->{inject_components}->{$injected_comp_name}->{from_component} || '';
2859       if($component_class) {
2860         my @roles = @{$class->config->{inject_components}->{$injected_comp_name}->{roles} ||[]};
2861         my %args = %{ $class->config->{$injected_comp_name} || +{} };
2862
2863         Catalyst::Utils::inject_component(
2864           into => $class,
2865           component => $component_class,
2866           (scalar(@roles) ? (traits => \@roles) : ()),
2867           as => $injected_comp_name);
2868       }
2869     }
2870
2871     # All components are registered, now we need to 'init' them.
2872     foreach my $component_name (keys %{$class->components||{}}) {
2873       $class->components->{$component_name} = $class->components->{$component_name}->() if
2874       (ref($class->components->{$component_name}) || '') eq 'CODE';
2875     }
2876 }
2877
2878 =head2 $app->inject_component($MyApp_Component_name => \%args);
2879
2880 Add a component that is injected at setup:
2881
2882     MyApp->inject_component( 'Model::Foo' => { from_component => 'Common::Foo' } );
2883
2884 Must be called before ->setup.  Expects a component name for your
2885 current application and \%args where
2886
2887 =over 4
2888
2889 =item from_component
2890
2891 The target component being injected into your application
2892
2893 =item roles
2894
2895 An arrayref of L<Moose::Role>s that are applied to your component.
2896
2897 =back
2898
2899 Example
2900
2901     MyApp->inject_component(
2902       'Model::Foo' => {
2903         from_component => 'Common::Model::Foo',
2904         roles => ['Role1', 'Role2'],
2905       });
2906
2907 =head2 $app->inject_components
2908
2909 Inject a list of components:
2910
2911     MyApp->inject_components(
2912       'Model::FooOne' => {
2913         from_component => 'Common::Model::Foo',
2914         roles => ['Role1', 'Role2'],
2915       },
2916       'Model::FooTwo' => {
2917         from_component => 'Common::Model::Foo',
2918         roles => ['Role1', 'Role2'],
2919       });
2920
2921 =cut
2922
2923 sub inject_component {
2924   my ($app, $name, $args) = @_;
2925   die "Component $name exists" if
2926     $app->config->{inject_components}->{$name};
2927   $app->config->{inject_components}->{$name} = $args;
2928 }
2929
2930 sub inject_components {
2931   my $app = shift;
2932   while(@_) {
2933     $app->inject_component(shift, shift);
2934   }
2935 }
2936
2937 =head2 $c->locate_components( $setup_component_config )
2938
2939 This method is meant to provide a list of component modules that should be
2940 setup for the application.  By default, it will use L<Module::Pluggable>.
2941
2942 Specify a C<setup_components> config option to pass additional options directly
2943 to L<Module::Pluggable>. To add additional search paths, specify a key named
2944 C<search_extra> as an array reference. Items in the array beginning with C<::>
2945 will have the application class name prepended to them.
2946
2947 =cut
2948
2949 sub locate_components {
2950     my $class  = shift;
2951     my $config = shift;
2952
2953     my @paths   = qw( ::M ::Model ::V ::View ::C ::Controller );
2954     my $extra   = delete $config->{ search_extra } || [];
2955
2956     unshift @paths, @$extra;
2957
2958     my @comps = map { sort { length($a) <=> length($b) } Module::Pluggable::Object->new(
2959       search_path => [ map { s/^(?=::)/$class/; $_; } ($_) ],
2960       %$config
2961     )->plugins } @paths;
2962
2963     return @comps;
2964 }
2965
2966 =head2 $c->expand_component_module( $component, $setup_component_config )
2967
2968 Components found by C<locate_components> will be passed to this method, which
2969 is expected to return a list of component (package) names to be set up.
2970
2971 =cut
2972
2973 sub expand_component_module {
2974     my ($class, $module) = @_;
2975     return Devel::InnerPackage::list_packages( $module );
2976 }
2977
2978 =head2 $app->delayed_setup_component
2979
2980 Returns a coderef that points to a setup_component instance.  Used
2981 internally for when you want to delay setup until the first time
2982 the component is called.
2983
2984 =cut
2985
2986 sub delayed_setup_component {
2987   my($class, $component, @more) = @_;
2988   return sub {
2989     return my $instance = $class->setup_component($component, @more);
2990   };
2991 }
2992
2993 =head2 $c->setup_component
2994
2995 =cut
2996
2997 sub setup_component {
2998     my( $class, $component ) = @_;
2999
3000     unless ( $component->can( 'COMPONENT' ) ) {
3001         return $component;
3002     }
3003
3004     my $suffix = Catalyst::Utils::class2classsuffix( $component );
3005     my $config = $class->config->{ $suffix } || {};
3006     # Stash catalyst_component_name in the config here, so that custom COMPONENT
3007     # methods also pass it. local to avoid pointlessly shitting in config
3008     # for the debug screen, as $component is already the key name.
3009     local $config->{catalyst_component_name} = $component;
3010
3011     my $instance = eval {
3012       $component->COMPONENT( $class, $config );
3013     } || do {
3014       my $error = $@;
3015       chomp $error;
3016       Catalyst::Exception->throw(
3017         message => qq/Couldn't instantiate component "$component", "$error"/
3018       );
3019     };
3020
3021     unless (blessed $instance) {
3022         my $metaclass = Moose::Util::find_meta($component);
3023         my $method_meta = $metaclass->find_method_by_name('COMPONENT');
3024         my $component_method_from = $method_meta->associated_metaclass->name;
3025         my $value = defined($instance) ? $instance : 'undef';
3026         Catalyst::Exception->throw(
3027             message =>
3028             qq/Couldn't instantiate component "$component", COMPONENT() method (from $component_method_from) didn't return an object-like value (value was $value)./
3029         );
3030     }
3031
3032     my @expanded_components = $instance->can('expand_modules')
3033       ? $instance->expand_modules( $component, $config )
3034       : $class->expand_component_module( $component, $config );
3035     for my $component (@expanded_components) {
3036       next if $class->components->{ $component };
3037       $class->components->{ $component } = $class->setup_component($component);
3038     }
3039
3040     return $instance; 
3041 }
3042
3043 =head2 $c->setup_dispatcher
3044
3045 Sets up dispatcher.
3046
3047 =cut
3048
3049 sub setup_dispatcher {
3050     my ( $class, $dispatcher ) = @_;
3051
3052     if ($dispatcher) {
3053         $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
3054     }
3055
3056     if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
3057         $dispatcher = 'Catalyst::Dispatcher::' . $env;
3058     }
3059
3060     unless ($dispatcher) {
3061         $dispatcher = $class->dispatcher_class;
3062     }
3063
3064     load_class($dispatcher);
3065
3066     # dispatcher instance
3067     $class->dispatcher( $dispatcher->new );
3068 }
3069
3070 =head2 $c->setup_engine
3071
3072 Sets up engine.
3073
3074 =cut
3075
3076 sub engine_class {
3077     my ($class, $requested_engine) = @_;
3078
3079     if (!$class->engine_loader || $requested_engine) {
3080         $class->engine_loader(
3081             Catalyst::EngineLoader->new({
3082                 application_name => $class,
3083                 (defined $requested_engine
3084                      ? (catalyst_engine_class => $requested_engine) : ()),
3085             }),
3086         );
3087     }
3088
3089     $class->engine_loader->catalyst_engine_class;
3090 }
3091
3092 sub setup_engine {
3093     my ($class, $requested_engine) = @_;
3094
3095     my $engine = do {
3096         my $loader = $class->engine_loader;
3097
3098         if (!$loader || $requested_engine) {
3099             $loader = Catalyst::EngineLoader->new({
3100                 application_name => $class,
3101                 (defined $requested_engine
3102                      ? (requested_engine => $requested_engine) : ()),
3103             }),
3104
3105             $class->engine_loader($loader);
3106         }
3107
3108         $loader->catalyst_engine_class;
3109     };
3110
3111     # Don't really setup_engine -- see _setup_psgi_app for explanation.
3112     return if $class->loading_psgi_file;
3113
3114     load_class($engine);
3115
3116     if ($ENV{MOD_PERL}) {
3117         my $apache = $class->engine_loader->auto;
3118
3119         my $meta = find_meta($class);
3120         my $was_immutable = $meta->is_immutable;
3121         my %immutable_options = $meta->immutable_options;
3122         $meta->make_mutable if $was_immutable;
3123
3124         $meta->add_method(handler => sub {
3125             my $r = shift;
3126             my $psgi_app = $class->_finalized_psgi_app;
3127             $apache->call_app($r, $psgi_app);
3128         });
3129
3130         $meta->make_immutable(%immutable_options) if $was_immutable;
3131     }
3132
3133     $class->engine( $engine->new );
3134
3135     return;
3136 }
3137
3138 ## This exists just to supply a prebuild psgi app for mod_perl and for the 
3139 ## build in server support (back compat support for pre psgi port behavior).
3140 ## This is so that we don't build a new psgi app for each request when using
3141 ## the mod_perl handler or the built in servers (http and fcgi, etc).
3142
3143 sub _finalized_psgi_app {
3144     my ($app) = @_;
3145
3146     unless ($app->_psgi_app) {
3147         my $psgi_app = $app->_setup_psgi_app;
3148         $app->_psgi_app($psgi_app);
3149     }
3150
3151     return $app->_psgi_app;
3152 }
3153
3154 ## Look for a psgi file like 'myapp_web.psgi' (if the app is MyApp::Web) in the
3155 ## home directory and load that and return it (just assume it is doing the 
3156 ## right thing :) ).  If that does not exist, call $app->psgi_app, wrap that
3157 ## in default_middleware and return it ( this is for backward compatibility
3158 ## with pre psgi port behavior ).
3159
3160 sub _setup_psgi_app {
3161     my ($app) = @_;
3162
3163     for my $home (Path::Class::Dir->new($app->config->{home})) {
3164         my $psgi_file = $home->file(
3165             Catalyst::Utils::appprefix($app) . '.psgi',
3166         );
3167
3168         next unless -e $psgi_file;
3169
3170         # If $psgi_file calls ->setup_engine, it's doing so to load
3171         # Catalyst::Engine::PSGI. But if it does that, we're only going to
3172         # throw away the loaded PSGI-app and load the 5.9 Catalyst::Engine
3173         # anyway. So set a flag (ick) that tells setup_engine not to populate
3174         # $c->engine or do any other things we might regret.
3175
3176         $app->loading_psgi_file(1);
3177         my $psgi_app = Plack::Util::load_psgi($psgi_file);
3178         $app->loading_psgi_file(0);
3179
3180         return $psgi_app
3181             unless $app->engine_loader->needs_psgi_engine_compat_hack;
3182
3183         warn <<"EOW";
3184 Found a legacy Catalyst::Engine::PSGI .psgi file at ${psgi_file}.
3185
3186 Its content has been ignored. Please consult the Catalyst::Upgrading
3187 documentation on how to upgrade from Catalyst::Engine::PSGI.
3188 EOW
3189     }
3190
3191     return $app->apply_default_middlewares($app->psgi_app);
3192 }
3193
3194 =head2 $c->apply_default_middlewares
3195
3196 Adds the following L<Plack> middlewares to your application, since they are
3197 useful and commonly needed:
3198
3199 L<Plack::Middleware::LighttpdScriptNameFix> (if you are using Lighttpd),
3200 L<Plack::Middleware::IIS6ScriptNameFix> (always applied since this middleware
3201 is smart enough to conditionally apply itself).
3202
3203 We will also automatically add L<Plack::Middleware::ReverseProxy> if we notice
3204 that your HTTP $env variable C<REMOTE_ADDR> is '127.0.0.1'.  This is usually
3205 an indication that your server is running behind a proxy frontend.  However in
3206 2014 this is often not the case.  We preserve this code for backwards compatibility
3207 however I B<highly> recommend that if you are running the server behind a front
3208 end proxy that you clearly indicate so with the C<using_frontend_proxy> configuration
3209 setting to true for your environment configurations that run behind a proxy.  This
3210 way if you change your front end proxy address someday your code would inexplicably
3211 stop working as expected.
3212
3213 Additionally if we detect we are using Nginx, we add a bit of custom middleware
3214 to solve some problems with the way that server handles $ENV{PATH_INFO} and
3215 $ENV{SCRIPT_NAME}.
3216
3217 Please B<NOTE> that if you do use C<using_frontend_proxy> the middleware is now
3218 adding via C<registered_middleware> rather than this method.
3219
3220 If you are using Lighttpd or IIS6 you may wish to apply these middlewares.  In
3221 general this is no longer a common case but we have this here for backward
3222 compatibility.
3223
3224 =cut
3225
3226
3227 sub apply_default_middlewares {
3228     my ($app, $psgi_app) = @_;
3229
3230     # Don't add this conditional IF we are explicitly saying we want the
3231     # frontend proxy support.  We don't need it here since if that is the
3232     # case it will be always loaded in the default_middleware.
3233
3234     unless($app->config->{using_frontend_proxy}) {
3235       $psgi_app = Plack::Middleware::Conditional->wrap(
3236           $psgi_app,
3237           builder   => sub { Plack::Middleware::ReverseProxy->wrap($_[0]) },
3238           condition => sub {
3239               my ($env) = @_;
3240               return if $app->config->{ignore_frontend_proxy};
3241               return $env->{REMOTE_ADDR} eq '127.0.0.1';
3242           },
3243       );
3244     }
3245
3246     # If we're running under Lighttpd, swap PATH_INFO and SCRIPT_NAME
3247     # http://lists.scsys.co.uk/pipermail/catalyst/2006-June/008361.html
3248     $psgi_app = Plack::Middleware::Conditional->wrap(
3249         $psgi_app,
3250         builder   => sub { Plack::Middleware::LighttpdScriptNameFix->wrap($_[0]) },
3251         condition => sub {
3252             my ($env) = @_;
3253             return unless $env->{SERVER_SOFTWARE} && $env->{SERVER_SOFTWARE} =~ m!lighttpd[-/]1\.(\d+\.\d+)!;
3254             return unless $1 < 4.23;
3255             1;
3256         },
3257     );
3258
3259     # we're applying this unconditionally as the middleware itself already makes
3260     # sure it doesn't fuck things up if it's not running under one of the right
3261     # IIS versions
3262     $psgi_app = Plack::Middleware::IIS6ScriptNameFix->wrap($psgi_app);
3263
3264     # And another IIS issue, this time with IIS7.
3265     $psgi_app = Plack::Middleware::Conditional->wrap(
3266         $psgi_app,
3267         builder => sub { Plack::Middleware::IIS7KeepAliveFix->wrap($_[0]) },
3268         condition => sub {
3269             my ($env) = @_;
3270             return $env->{SERVER_SOFTWARE} && $env->{SERVER_SOFTWARE} =~ m!IIS/7\.[0-9]!;
3271         },
3272     );
3273
3274     return $psgi_app;
3275 }
3276
3277 =head2 App->psgi_app
3278
3279 =head2 App->to_app
3280
3281 Returns a PSGI application code reference for the catalyst application
3282 C<$c>. This is the bare application created without the C<apply_default_middlewares>
3283 method called.  We do however apply C<registered_middleware> since those are
3284 integral to how L<Catalyst> functions.  Also, unlike starting your application
3285 with a generated server script (via L<Catalyst::Devel> and C<catalyst.pl>) we do
3286 not attempt to return a valid L<PSGI> application using any existing C<${myapp}.psgi>
3287 scripts in your $HOME directory.
3288
3289 B<NOTE> C<apply_default_middlewares> was originally created when the first PSGI
3290 port was done for v5.90000.  These are middlewares that are added to achieve
3291 backward compatibility with older applications.  If you start your application
3292 using one of the supplied server scripts (generated with L<Catalyst::Devel> and
3293 the project skeleton script C<catalyst.pl>) we apply C<apply_default_middlewares>
3294 automatically.  This was done so that pre and post PSGI port applications would
3295 work the same way.
3296
3297 This is what you want to be using to retrieve the PSGI application code
3298 reference of your Catalyst application for use in a custom F<.psgi> or in your
3299 own created server modules.
3300
3301 =cut
3302
3303 *to_app = \&psgi_app;
3304
3305 sub psgi_app {
3306     my ($app) = @_;
3307     my $psgi = $app->engine->build_psgi_app($app);
3308     return $app->Catalyst::Utils::apply_registered_middleware($psgi);
3309 }
3310
3311 =head2 $c->setup_home
3312
3313 Sets up the home directory.
3314
3315 =cut
3316
3317 sub setup_home {
3318     my ( $class, $home ) = @_;
3319
3320     if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
3321         $home = $env;
3322     }
3323
3324     $home ||= Catalyst::Utils::home($class);
3325
3326     if ($home) {
3327         #I remember recently being scolded for assigning config values like this
3328         $class->config->{home} ||= $home;
3329         $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
3330     }
3331 }
3332
3333 =head2 $c->setup_encoding
3334
3335 Sets up the input/output encoding. See L<ENCODING>
3336
3337 =cut
3338
3339 sub setup_encoding {
3340     my $c = shift;
3341     if( exists($c->config->{encoding}) && !defined($c->config->{encoding}) ) {
3342         # Ok, so the user has explicitly said "I don't want encoding..."
3343         return;
3344     } else {
3345       my $enc = defined($c->config->{encoding}) ?
3346         delete $c->config->{encoding} : 'UTF-8'; # not sure why we delete it... (JNAP)
3347       $c->encoding($enc);
3348     }
3349 }
3350
3351 =head2 handle_unicode_encoding_exception
3352
3353 Hook to let you customize how encoding errors are handled.  By default
3354 we just throw an exception.  Receives a hashref of debug information.
3355 Example:
3356
3357     $c->handle_unicode_encoding_exception({
3358         param_value => $value,
3359         error_msg => $_,
3360             encoding_step => 'params',
3361         });
3362
3363 =cut
3364
3365 sub handle_unicode_encoding_exception {
3366     my ( $self, $exception_ctx ) = @_;
3367     die $exception_ctx->{error_msg};
3368 }
3369
3370 # Some unicode helpers cargo culted from the old plugin.  These could likely
3371 # be neater.
3372
3373 sub _handle_unicode_decoding {
3374     my ( $self, $value ) = @_;
3375
3376     return unless defined $value;
3377
3378     ## I think this mess is to support the old nested
3379     if ( ref $value eq 'ARRAY' ) {
3380         foreach ( @$value ) {
3381             $_ = $self->_handle_unicode_decoding($_);
3382         }
3383         return $value;
3384     }
3385     elsif ( ref $value eq 'HASH' ) {
3386         foreach (keys %$value) {
3387             my $encoded_key = $self->_handle_param_unicode_decoding($_);
3388             $value->{$encoded_key} = $self->_handle_unicode_decoding($value->{$_});
3389
3390             # If the key was encoded we now have two (the original and current so
3391             # delete the original.
3392             delete $value->{$_} if $_ ne $encoded_key;
3393         }
3394         return $value;
3395     }
3396     else {
3397         return $self->_handle_param_unicode_decoding($value);
3398     }
3399 }
3400
3401 sub _handle_param_unicode_decoding {
3402     my ( $self, $value ) = @_;
3403     return unless defined $value; # not in love with just ignoring undefs - jnap
3404     return $value if blessed($value); #don't decode when the value is an object.
3405
3406     my $enc = $self->encoding;
3407     return try {
3408       $enc->decode( $value, $self->_encode_check );
3409     }
3410     catch {
3411         $self->handle_unicode_encoding_exception({
3412             param_value => $value,
3413             error_msg => $_,
3414             encoding_step => 'params',
3415         });
3416     };
3417 }
3418
3419 =head2 $c->setup_log
3420
3421 Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and
3422 passing it to C<log()>. Pass in a comma-delimited list of levels to set the
3423 log to.
3424
3425 This method also installs a C<debug> method that returns a true value into the
3426 catalyst subclass if the "debug" level is passed in the comma-delimited list,
3427 or if the C<$CATALYST_DEBUG> environment variable is set to a true value.
3428
3429 Note that if the log has already been setup, by either a previous call to
3430 C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>,
3431 that this method won't actually set up the log object.
3432
3433 =cut
3434
3435 sub setup_log {
3436     my ( $class, $levels ) = @_;
3437
3438     $levels ||= '';
3439     $levels =~ s/^\s+//;
3440     $levels =~ s/\s+$//;
3441     my %levels = map { $_ => 1 } split /\s*,\s*/, $levels;
3442
3443     my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
3444     if ( defined $env_debug ) {
3445         $levels{debug} = 1 if $env_debug; # Ugly!
3446         delete($levels{debug}) unless $env_debug;
3447     }
3448
3449     unless ( $class->log ) {
3450         $class->log( Catalyst::Log->new(keys %levels) );
3451     }
3452
3453     if ( $levels{debug} ) {
3454         Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
3455         $class->log->debug('Debug messages enabled');
3456     }
3457 }
3458
3459 =head2 $c->setup_plugins
3460
3461 Sets up plugins.
3462
3463 =cut
3464
3465 =head2 $c->setup_stats
3466
3467 Sets up timing statistics class.
3468
3469 =cut
3470
3471 sub setup_stats {
3472     my ( $class, $stats ) = @_;
3473
3474     Catalyst::Utils::ensure_class_loaded($class->stats_class);
3475
3476     my $env = Catalyst::Utils::env_value( $class, 'STATS' );
3477     if ( defined($env) ? $env : ($stats || $class->debug ) ) {
3478         Class::MOP::get_metaclass_by_name($class)->add_method('use_stats' => sub { 1 });
3479         $class->log->debug('Statistics enabled');
3480     }
3481 }
3482
3483
3484 =head2 $c->registered_plugins
3485
3486 Returns a sorted list of the plugins which have either been stated in the
3487 import list.
3488
3489 If passed a given plugin name, it will report a boolean value indicating
3490 whether or not that plugin is loaded.  A fully qualified name is required if
3491 the plugin name does not begin with C<Catalyst::Plugin::>.
3492
3493  if ($c->registered_plugins('Some::Plugin')) {
3494      ...
3495  }
3496
3497 =cut
3498
3499 {
3500
3501     sub registered_plugins {
3502         my $proto = shift;
3503         return sort keys %{ $proto->_plugins } unless @_;
3504         my $plugin = shift;
3505         return 1 if exists $proto->_plugins->{$plugin};
3506         return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
3507     }
3508
3509     sub _register_plugin {
3510         my ( $proto, $plugin, $instant ) = @_;
3511         my $class = ref $proto || $proto;
3512
3513         load_class( $plugin );
3514         $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is deprecated and will not work in 5.81" )
3515             if $plugin->isa( 'Catalyst::Component' );
3516         my $plugin_meta = Moose::Meta::Class->create($plugin);
3517         if (!$plugin_meta->has_method('new')
3518             && ( $plugin->isa('Class::Accessor::Fast') || $plugin->isa('Class::Accessor') ) ) {
3519             $plugin_meta->add_method('new', Moose::Object->meta->get_method('new'))
3520         }
3521         if (!$instant && !$proto->_plugins->{$plugin}) {
3522             my $meta = Class::MOP::get_metaclass_by_name($class);
3523             $meta->superclasses($plugin, $meta->superclasses);
3524         }
3525         $proto->_plugins->{$plugin} = 1;
3526         return $class;
3527     }
3528
3529     sub _default_plugins { return qw() }
3530
3531     sub setup_plugins {
3532         my ( $class, $plugins ) = @_;
3533
3534         $class->_plugins( {} ) unless $class->_plugins;
3535         $plugins = [ grep {
3536             m/Unicode::Encoding/ ? do {
3537                 $class->log->warn(
3538                     'Unicode::Encoding plugin is auto-applied,'
3539                     . ' please remove this from your appclass'
3540                     . ' and make sure to define "encoding" config'
3541                 );
3542                 unless (exists $class->config->{'encoding'}) {
3543                   $class->config->{'encoding'} = 'UTF-8';
3544                 }
3545                 () }
3546                 : $_
3547         } @$plugins ];
3548         push @$plugins, $class->_default_plugins;
3549         $plugins = Data::OptList::mkopt($plugins || []);
3550
3551         my @plugins = map {
3552             [ Catalyst::Utils::resolve_namespace(
3553                   $class . '::Plugin',
3554                   'Catalyst::Plugin', $_->[0]
3555               ),
3556               $_->[1],
3557             ]
3558          } @{ $plugins };
3559
3560         for my $plugin ( reverse @plugins ) {
3561             load_class($plugin->[0], $plugin->[1]);
3562             my $meta = find_meta($plugin->[0]);
3563             next if $meta && $meta->isa('Moose::Meta::Role');
3564
3565             $class->_register_plugin($plugin->[0]);
3566         }
3567
3568         my @roles =
3569             map  { $_->[0]->name, $_->[1] }
3570             grep { blessed($_->[0]) && $_->[0]->isa('Moose::Meta::Role') }
3571             map  { [find_meta($_->[0]), $_->[1]] }
3572             @plugins;
3573
3574         Moose::Util::apply_all_roles(
3575             $class => @roles
3576         ) if @roles;
3577     }
3578 }
3579
3580 =head2 default_middleware
3581
3582 Returns a list of instantiated PSGI middleware objects which is the default
3583 middleware that is active for this application (taking any configuration
3584 options into account, excluding your custom added middleware via the C<psgi_middleware>
3585 configuration option).  You can override this method if you wish to change
3586 the default middleware (although do so at risk since some middleware is vital
3587 to application function.)
3588
3589 The current default middleware list is:
3590
3591       Catalyst::Middleware::Stash
3592       Plack::Middleware::HTTPExceptions
3593       Plack::Middleware::RemoveRedundantBody
3594       Plack::Middleware::FixMissingBodyInRedirect
3595       Plack::Middleware::ContentLength
3596       Plack::Middleware::MethodOverride
3597       Plack::Middleware::Head
3598
3599 If the configuration setting C<using_frontend_proxy> is true we add:
3600
3601       Plack::Middleware::ReverseProxy
3602
3603 If the configuration setting C<using_frontend_proxy_path> is true we add:
3604
3605       Plack::Middleware::ReverseProxyPath
3606
3607 But B<NOTE> that L<Plack::Middleware::ReverseProxyPath> is not a dependency of the
3608 L<Catalyst> distribution so if you want to use this option you should add it to
3609 your project distribution file.
3610
3611 These middlewares will be added at L</setup_middleware> during the
3612 L</setup> phase of application startup.
3613
3614 =cut
3615
3616 sub default_middleware {
3617     my $class = shift;
3618     my @mw = (
3619       Catalyst::Middleware::Stash->new,
3620       Plack::Middleware::HTTPExceptions->new,
3621       Plack::Middleware::RemoveRedundantBody->new,
3622       Plack::Middleware::FixMissingBodyInRedirect->new,
3623       Plack::Middleware::ContentLength->new,
3624       Plack::Middleware::MethodOverride->new,
3625       Plack::Middleware::Head->new);
3626
3627     if($class->config->{using_frontend_proxy}) {
3628         push @mw, Plack::Middleware::ReverseProxy->new;
3629     }
3630
3631     if($class->config->{using_frontend_proxy_path}) {
3632         if(Class::Load::try_load_class('Plack::Middleware::ReverseProxyPath')) {
3633             push @mw, Plack::Middleware::ReverseProxyPath->new;
3634         } else {
3635           $class->log->error("Cannot use configuration 'using_frontend_proxy_path' because 'Plack::Middleware::ReverseProxyPath' is not installed");
3636         }
3637     }
3638
3639     return @mw;
3640 }
3641
3642 =head2 registered_middlewares
3643
3644 Read only accessor that returns an array of all the middleware in the order
3645 that they were added (which is the REVERSE of the order they will be applied).
3646
3647 The values returned will be either instances of L<Plack::Middleware> or of a
3648 compatible interface, or a coderef, which is assumed to be inlined middleware
3649
3650 =head2 setup_middleware (?@middleware)
3651
3652 Read configuration information stored in configuration key C<psgi_middleware> or
3653 from passed @args.
3654
3655 See under L</CONFIGURATION> information regarding C<psgi_middleware> and how
3656 to use it to enable L<Plack::Middleware>
3657
3658 This method is automatically called during 'setup' of your application, so
3659 you really don't need to invoke it.  However you may do so if you find the idea
3660 of loading middleware via configuration weird :).  For example:
3661
3662     package MyApp;
3663
3664     use Catalyst;
3665
3666     __PACKAGE__->setup_middleware('Head');
3667     __PACKAGE__->setup;
3668
3669 When we read middleware definitions from configuration, we reverse the list
3670 which sounds odd but is likely how you expect it to work if you have prior
3671 experience with L<Plack::Builder> or if you previously used the plugin
3672 L<Catalyst::Plugin::EnableMiddleware> (which is now considered deprecated)
3673
3674 So basically your middleware handles an incoming request from the first
3675 registered middleware, down and handles the response from the last middleware
3676 up.
3677
3678 =cut
3679
3680 sub registered_middlewares {
3681     my $class = shift;
3682     if(my $middleware = $class->_psgi_middleware) {
3683         my @mw = ($class->default_middleware, @$middleware);
3684
3685         if($class->config->{using_frontend_proxy}) {
3686           push @mw, Plack::Middleware::ReverseProxy->new;
3687         }
3688
3689         return @mw;
3690     } else {
3691         die "You cannot call ->registered_middlewares until middleware has been setup";
3692     }
3693 }
3694
3695 sub setup_middleware {
3696     my $class = shift;
3697     my @middleware_definitions;
3698
3699     # If someone calls this method you can add middleware with args.  However if its
3700     # called without an arg we need to setup the configuration middleware.
3701     if(@_) {
3702       @middleware_definitions = reverse(@_);
3703     } else {
3704       @middleware_definitions = reverse(@{$class->config->{'psgi_middleware'}||[]})
3705         unless $class->finalized_default_middleware;
3706       $class->finalized_default_middleware(1); # Only do this once, just in case some people call setup over and over...
3707     }
3708
3709     my @middleware = ();
3710     while(my $next = shift(@middleware_definitions)) {
3711         if(ref $next) {
3712             if(Scalar::Util::blessed $next && $next->can('wrap')) {
3713                 push @middleware, $next;
3714             } elsif(ref $next eq 'CODE') {
3715                 push @middleware, $next;
3716             } elsif(ref $next eq 'HASH') {
3717                 my $namespace = shift @middleware_definitions;
3718                 my $mw = $class->Catalyst::Utils::build_middleware($namespace, %$next);
3719                 push @middleware, $mw;
3720             } else {
3721               die "I can't handle middleware definition ${\ref $next}";
3722             }
3723         } else {
3724           my $mw = $class->Catalyst::Utils::build_middleware($next);
3725           push @middleware, $mw;
3726         }
3727     }
3728
3729     my @existing = @{$class->_psgi_middleware || []};
3730     $class->_psgi_middleware([@middleware,@existing,]);
3731 }
3732
3733 =head2 registered_data_handlers
3734
3735 A read only copy of registered Data Handlers returned as a Hash, where each key
3736 is a content type and each value is a subref that attempts to decode that content
3737 type.
3738
3739 =head2 setup_data_handlers (?@data_handler)
3740
3741 Read configuration information stored in configuration key C<data_handlers> or
3742 from passed @args.
3743
3744 See under L</CONFIGURATION> information regarding C<data_handlers>.
3745
3746 This method is automatically called during 'setup' of your application, so
3747 you really don't need to invoke it.
3748
3749 =head2 default_data_handlers
3750
3751 Default Data Handlers that come bundled with L<Catalyst>.  Currently there are
3752 only two default data handlers, for 'application/json' and an alternative to
3753 'application/x-www-form-urlencoded' which supposed nested form parameters via
3754 L<CGI::Struct> or via L<CGI::Struct::XS> IF you've installed it.
3755
3756 The 'application/json' data handler is used to parse incoming JSON into a Perl
3757 data structure.  It used either L<JSON::MaybeXS> or L<JSON>, depending on which
3758 is installed.  This allows you to fail back to L<JSON:PP>, which is a Pure Perl
3759 JSON decoder, and has the smallest dependency impact.
3760
3761 Because we don't wish to add more dependencies to L<Catalyst>, if you wish to
3762 use this new feature we recommend installing L<JSON> or L<JSON::MaybeXS> in
3763 order to get the best performance.  You should add either to your dependency
3764 list (Makefile.PL, dist.ini, cpanfile, etc.)
3765
3766 =cut
3767
3768 sub registered_data_handlers {
3769     my $class = shift;
3770     if(my $data_handlers = $class->_data_handlers) {
3771         return %$data_handlers;
3772     } else {
3773         $class->setup_data_handlers;
3774         return $class->registered_data_handlers;
3775     }
3776 }
3777
3778 sub setup_data_handlers {
3779     my ($class, %data_handler_callbacks) = @_;
3780     %data_handler_callbacks = (
3781       %{$class->default_data_handlers},
3782       %{$class->config->{'data_handlers'}||+{}},
3783       %data_handler_callbacks);
3784
3785     $class->_data_handlers(\%data_handler_callbacks);
3786 }
3787
3788 sub default_data_handlers {
3789     my ($class) = @_;
3790     return +{
3791       'application/x-www-form-urlencoded' => sub {
3792           my ($fh, $req) = @_;
3793           my $params = $req->_use_hash_multivalue ? $req->body_parameters->mixed : $req->body_parameters;
3794           Class::Load::load_first_existing_class('CGI::Struct::XS', 'CGI::Struct')
3795             ->can('build_cgi_struct')->($params);
3796       },
3797       'application/json' => sub {
3798           my ($fh, $req) = @_;
3799           my $parser = Class::Load::load_first_existing_class('JSON::MaybeXS', 'JSON');
3800           my $slurped;
3801           return eval { 
3802             local $/;
3803             $slurped = $fh->getline;
3804             $parser->can("decode_json")->($slurped); # decode_json does utf8 decoding for us
3805           } || Catalyst::Exception->throw(sprintf "Error Parsing POST '%s', Error: %s", (defined($slurped) ? $slurped : 'undef') ,$@);
3806         },
3807     };
3808 }
3809
3810 sub _handle_http_exception {
3811     my ( $self, $error ) = @_;
3812     if (
3813            !$self->config->{always_catch_http_exceptions}
3814         && blessed $error
3815         && (
3816             $error->can('as_psgi')
3817             || (   $error->can('code')
3818                 && $error->code =~ m/^[1-5][0-9][0-9]$/ )
3819         )
3820       )
3821     {
3822         return 1;
3823     }
3824 }
3825
3826 =head2 $c->stack
3827
3828 Returns an arrayref of the internal execution stack (actions that are
3829 currently executing).
3830
3831 =head2 $c->stats
3832
3833 Returns the current timing statistics object. By default Catalyst uses
3834 L<Catalyst::Stats|Catalyst::Stats>, but can be set otherwise with
3835 L<< stats_class|/"$c->stats_class" >>.
3836
3837 Even if L<< -Stats|/"-Stats" >> is not enabled, the stats object is still
3838 available. By enabling it with C< $c->stats->enabled(1) >, it can be used to
3839 profile explicitly, although MyApp.pm still won't profile nor output anything
3840 by itself.
3841
3842 =head2 $c->stats_class
3843
3844 Returns or sets the stats (timing statistics) class. L<Catalyst::Stats|Catalyst::Stats> is used by default.
3845
3846 =head2 $app->stats_class_traits
3847
3848 A arrayref of L<Moose::Role>s that are applied to the stats_class before creating it.
3849
3850 =head2 $app->composed_stats_class
3851
3852 this is the stats_class composed with any 'stats_class_traits'.
3853
3854 =head2 $c->use_stats
3855
3856 Returns 1 when L<< stats collection|/"-Stats" >> is enabled.
3857
3858 Note that this is a static method, not an accessor and should be overridden
3859 by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
3860
3861 =cut
3862
3863 sub use_stats { 0 }
3864
3865
3866 =head2 $c->write( $data )
3867
3868 Writes $data to the output stream. When using this method directly, you
3869 will need to manually set the C<Content-Length> header to the length of
3870 your output data, if known.
3871
3872 =cut
3873
3874 sub write {
3875     my $c = shift;
3876
3877     # Finalize headers if someone manually writes output (for compat)
3878     $c->finalize_headers;
3879
3880     return $c->response->write( @_ );
3881 }
3882
3883 =head2 version
3884
3885 Returns the Catalyst version number. Mostly useful for "powered by"
3886 messages in template systems.
3887
3888 =cut
3889
3890 sub version { return $Catalyst::VERSION }
3891
3892 =head1 CONFIGURATION
3893
3894 There are a number of 'base' config variables which can be set:
3895
3896 =over
3897
3898 =item *
3899
3900 C<always_catch_http_exceptions> - As of version 5.90060 Catalyst
3901 rethrows errors conforming to the interface described by
3902 L<Plack::Middleware::HTTPExceptions> and lets the middleware deal with it.
3903 Set true to get the deprecated behaviour and have Catalyst catch HTTP exceptions.
3904
3905 =item *
3906
3907 C<default_model> - The default model picked if you say C<< $c->model >>. See L<< /$c->model($name) >>.
3908
3909 =item *
3910
3911 C<default_view> - The default view to be rendered or returned when C<< $c->view >> is called. See L<< /$c->view($name) >>.
3912
3913 =item *
3914
3915 C<disable_component_resolution_regex_fallback> - Turns
3916 off the deprecated component resolution functionality so
3917 that if any of the component methods (e.g. C<< $c->controller('Foo') >>)
3918 are called then regex search will not be attempted on string values and
3919 instead C<undef> will be returned.
3920
3921 =item *
3922
3923 C<home> - The application home directory. In an uninstalled application,
3924 this is the top level application directory. In an installed application,
3925 this will be the directory containing C<< MyApp.pm >>.
3926
3927 =item *
3928
3929 C<ignore_frontend_proxy> - See L</PROXY SUPPORT>
3930
3931 =item *
3932
3933 C<name> - The name of the application in debug messages and the debug and
3934 welcome screens
3935
3936 =item *
3937
3938 C<parse_on_demand> - The request body (for example file uploads) will not be parsed
3939 until it is accessed. This allows you to (for example) check authentication (and reject
3940 the upload) before actually receiving all the data. See L</ON-DEMAND PARSER>
3941
3942 =item *
3943
3944 C<root> - The root directory for templates. Usually this is just a
3945 subdirectory of the home directory, but you can set it to change the
3946 templates to a different directory.
3947
3948 =item *
3949
3950 C<search_extra> - Array reference passed to Module::Pluggable to for additional
3951 namespaces from which components will be loaded (and constructed and stored in
3952 C<< $c->components >>).
3953
3954 =item *
3955
3956 C<show_internal_actions> - If true, causes internal actions such as C<< _DISPATCH >>
3957 to be shown in hit debug tables in the test server.
3958
3959 =item *
3960
3961 C<use_request_uri_for_path> - Controls if the C<REQUEST_URI> or C<PATH_INFO> environment
3962 variable should be used for determining the request path.
3963
3964 Most web server environments pass the requested path to the application using environment variables,
3965 from which Catalyst has to reconstruct the request base (i.e. the top level path to / in the application,
3966 exposed as C<< $c->request->base >>) and the request path below that base.
3967
3968 There are two methods of doing this, both of which have advantages and disadvantages. Which method is used
3969 is determined by the C<< $c->config(use_request_uri_for_path) >> setting (which can either be true or false).
3970
3971 =over
3972
3973 =item use_request_uri_for_path => 0
3974
3975 This is the default (and the) traditional method that Catalyst has used for determining the path information.
3976 The path is generated from a combination of the C<PATH_INFO> and C<SCRIPT_NAME> environment variables.
3977 The allows the application to behave correctly when C<mod_rewrite> is being used to redirect requests
3978 into the application, as these variables are adjusted by mod_rewrite to take account for the redirect.
3979
3980 However this method has the major disadvantage that it is impossible to correctly decode some elements
3981 of the path, as RFC 3875 says: "C<< Unlike a URI path, the PATH_INFO is not URL-encoded, and cannot
3982 contain path-segment parameters. >>" This means PATH_INFO is B<always> decoded, and therefore Catalyst
3983 can't distinguish / vs %2F in paths (in addition to other encoded values).
3984
3985 =item use_request_uri_for_path => 1
3986
3987 This method uses the C<REQUEST_URI> and C<SCRIPT_NAME> environment variables. As C<REQUEST_URI> is never
3988 decoded, this means that applications using this mode can correctly handle URIs including the %2F character
3989 (i.e. with C<AllowEncodedSlashes> set to C<On> in Apache).
3990
3991 Given that this method of path resolution is provably more correct, it is recommended that you use
3992 this unless you have a specific need to deploy your application in a non-standard environment, and you are
3993 aware of the implications of not being able to handle encoded URI paths correctly.
3994
3995 However it also means that in a number of cases when the app isn't installed directly at a path, but instead
3996 is having paths rewritten into it (e.g. as a .cgi/fcgi in a public_html directory, with mod_rewrite in a
3997 .htaccess file, or when SSI is used to rewrite pages into the app, or when sub-paths of the app are exposed
3998 at other URIs than that which the app is 'normally' based at with C<mod_rewrite>), the resolution of
3999 C<< $c->request->base >> will be incorrect.
4000
4001 =back
4002
4003 =item *
4004
4005 C<using_frontend_proxy> - See L</PROXY SUPPORT>.
4006
4007 =item *
4008
4009 C<using_frontend_proxy_path> - Enabled L<Plack::Middleware::ReverseProxyPath> on your application (if
4010 installed, otherwise log an error).  This is useful if your application is not running on the
4011 'root' (or /) of your host server.  B<NOTE> if you use this feature you should add the required
4012 middleware to your project dependency list since its not automatically a dependency of L<Catalyst>.
4013 This has been done since not all people need this feature and we wish to restrict the growth of
4014 L<Catalyst> dependencies.
4015
4016 =item *
4017
4018 C<encoding> - See L</ENCODING>
4019
4020 This now defaults to 'UTF-8'.  You my turn it off by setting this configuration
4021 value to undef.
4022
4023 =item *
4024
4025 C<abort_chain_on_error_fix>
4026
4027 When there is an error in an action chain, the default behavior is to continue
4028 processing the remaining actions and then catch the error upon chain end.  This
4029 can lead to running actions when the application is in an unexpected state.  If
4030 you have this issue, setting this config value to true will promptly exit a
4031 chain when there is an error raised in any action (thus terminating the chain
4032 early.)
4033
4034 use like:
4035
4036     __PACKAGE__->config(abort_chain_on_error_fix => 1);
4037
4038 In the future this might become the default behavior.
4039
4040 =item *
4041
4042 C<use_hash_multivalue_in_request>
4043
4044 In L<Catalyst::Request> the methods C<query_parameters>, C<body_parametes>
4045 and C<parameters> return a hashref where values might be scalar or an arrayref
4046 depending on the incoming data.  In many cases this can be undesirable as it
4047 leads one to writing defensive code like the following:
4048
4049     my ($val) = ref($c->req->parameters->{a}) ?
4050       @{$c->req->parameters->{a}} :
4051         $c->req->parameters->{a};
4052
4053 Setting this configuration item to true will make L<Catalyst> populate the
4054 attributes underlying these methods with an instance of L<Hash::MultiValue>
4055 which is used by L<Plack::Request> and others to solve this very issue.  You
4056 may prefer this behavior to the default, if so enable this option (be warned
4057 if you enable it in a legacy application we are not sure if it is completely
4058 backwardly compatible).
4059
4060 =item *
4061
4062 C<skip_complex_post_part_handling>
4063
4064 When creating body parameters from a POST, if we run into a multpart POST
4065 that does not contain uploads, but instead contains inlined complex data
4066 (very uncommon) we cannot reliably convert that into field => value pairs.  So
4067 instead we create an instance of L<Catalyst::Request::PartData>.  If this causes
4068 issue for you, you can disable this by setting C<skip_complex_post_part_handling>
4069 to true (default is false).  
4070
4071 =item *
4072
4073 C<skip_body_param_unicode_decoding>
4074
4075 Generally we decode incoming POST params based on your declared encoding (the
4076 default for this is to decode UTF-8).  If this is causing you trouble and you
4077 do not wish to turn all encoding support off (with the C<encoding> configuration
4078 parameter) you may disable this step atomically by setting this configuration
4079 parameter to true.
4080
4081 =item *
4082
4083 C<do_not_decode_query>
4084
4085 If true, then do not try to character decode any wide characters in your
4086 request URL query or keywords.  Most readings of the relevent specifications
4087 suggest these should be UTF-* encoded, which is the default that L<Catalyst>
4088 will use, hwoever if you are creating a lot of URLs manually or have external
4089 evil clients, this might cause you trouble.  If you find the changes introduced
4090 in Catalyst version 5.90080+ break some of your query code, you may disable 
4091 the UTF-8 decoding globally using this configuration.
4092
4093 This setting takes precedence over C<default_query_encoding> and
4094 C<decode_query_using_global_encoding>
4095
4096 =item *
4097
4098 C<default_query_encoding>
4099
4100 By default we decode query and keywords in your request URL using UTF-8, which
4101 is our reading of the relevent specifications.  This setting allows one to
4102 specify a fixed value for how to decode your query.  You might need this if
4103 you are doing a lot of custom encoding of your URLs and not using UTF-8.
4104
4105 This setting take precedence over C<decode_query_using_global_encoding>.
4106
4107 =item *
4108
4109 C<decode_query_using_global_encoding>
4110
4111 Setting this to true will default your query decoding to whatever your
4112 general global encoding is (the default is UTF-8).
4113
4114 =item *
4115
4116 C<use_chained_args_0_special_case>
4117
4118 In older versions of Catalyst, when more than one action matched the same path
4119 AND all those matching actions declared Args(0), we'd break the tie by choosing
4120 the first action defined.  We now normalized how Args(0) works so that it
4121 follows the same rule as Args(N), which is to say when we need to break a tie
4122 we choose the LAST action defined.  If this breaks your code and you don't
4123 have time to update to follow the new normalized approach, you may set this
4124 value to true and it will globally revert to the original chaining behavior.
4125
4126 =item *
4127
4128 C<psgi_middleware> - See L<PSGI MIDDLEWARE>.
4129
4130 =item *
4131
4132 C<data_handlers> - See L<DATA HANDLERS>.
4133
4134 =item *
4135
4136 C<stats_class_traits>
4137
4138 An arrayref of L<Moose::Role>s that get componsed into your stats class.
4139
4140 =item *
4141
4142 C<request_class_traits>
4143
4144 An arrayref of L<Moose::Role>s that get componsed into your request class.
4145
4146 =item *
4147
4148 C<response_class_traits>
4149
4150 An arrayref of L<Moose::Role>s that get componsed into your response class.
4151
4152 =item *
4153
4154 C<inject_components>
4155
4156 A Hashref of L<Catalyst::Component> subclasses that are 'injected' into configuration.
4157 For example:
4158
4159     MyApp->config({
4160       inject_components => {
4161         'Controller::Err' => { from_component => 'Local::Controller::Errors' },
4162         'Model::Zoo' => { from_component => 'Local::Model::Foo' },
4163         'Model::Foo' => { from_component => 'Local::Model::Foo', roles => ['TestRole'] },
4164       },
4165       'Controller::Err' => { a => 100, b=>200, namespace=>'error' },
4166       'Model::Zoo' => { a => 2 },
4167       'Model::Foo' => { a => 100 },
4168     });
4169
4170 Generally L<Catalyst> looks for components in your Model/View or Controller directories.
4171 However for cases when you which to use an existing component and you don't need any
4172 customization (where for when you can apply a role to customize it) you may inject those
4173 components into your application.  Please note any configuration should be done 'in the
4174 normal way', with a key under configuration named after the component affix, as in the
4175 above example.
4176
4177 Using this type of injection allows you to construct significant amounts of your application
4178 with only configuration!.  This may or may not lead to increased code understanding.
4179
4180 Please not you may also call the ->inject_components application method as well, although
4181 you must do so BEFORE setup.
4182
4183 =back
4184
4185 =head1 EXCEPTIONS
4186
4187 Generally when you throw an exception inside an Action (or somewhere in
4188 your stack, such as in a model that an Action is calling) that exception
4189 is caught by Catalyst and unless you either catch it yourself (via eval
4190 or something like L<Try::Tiny> or by reviewing the L</error> stack, it
4191 will eventually reach L</finalize_errors> and return either the debugging
4192 error stack page, or the default error page.  However, if your exception
4193 can be caught by L<Plack::Middleware::HTTPExceptions>, L<Catalyst> will
4194 instead rethrow it so that it can be handled by that middleware (which
4195 is part of the default middleware).  For example this would allow
4196
4197     use HTTP::Throwable::Factory 'http_throw';
4198
4199     sub throws_exception :Local {
4200       my ($self, $c) = @_;
4201
4202       http_throw(SeeOther => { location =>
4203         $c->uri_for($self->action_for('redirect')) });
4204
4205     }
4206
4207 =head1 INTERNAL ACTIONS
4208
4209 Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
4210 C<_ACTION>, and C<_END>. These are by default not shown in the private
4211 action table, but you can make them visible with a config parameter.
4212
4213     MyApp->config(show_internal_actions => 1);
4214
4215 =head1 ON-DEMAND PARSER
4216
4217 The request body is usually parsed at the beginning of a request,
4218 but if you want to handle input yourself, you can enable on-demand
4219 parsing with a config parameter.
4220
4221     MyApp->config(parse_on_demand => 1);
4222
4223 =head1 PROXY SUPPORT
4224
4225 Many production servers operate using the common double-server approach,
4226 with a lightweight frontend web server passing requests to a larger
4227 backend server. An application running on the backend server must deal
4228 with two problems: the remote user always appears to be C<127.0.0.1> and
4229 the server's hostname will appear to be C<localhost> regardless of the
4230 virtual host that the user connected through.
4231
4232 Catalyst will automatically detect this situation when you are running
4233 the frontend and backend servers on the same machine. The following
4234 changes are made to the request.
4235
4236     $c->req->address is set to the user's real IP address, as read from
4237     the HTTP X-Forwarded-For header.
4238
4239     The host value for $c->req->base and $c->req->uri is set to the real
4240     host, as read from the HTTP X-Forwarded-Host header.
4241
4242 Additionally, you may be running your backend application on an insecure
4243 connection (port 80) while your frontend proxy is running under SSL.  If there
4244 is a discrepancy in the ports, use the HTTP header C<X-Forwarded-Port> to
4245 tell Catalyst what port the frontend listens on.  This will allow all URIs to
4246 be created properly.
4247
4248 In the case of passing in:
4249
4250     X-Forwarded-Port: 443
4251
4252 All calls to C<uri_for> will result in an https link, as is expected.
4253
4254 Obviously, your web server must support these headers for this to work.
4255
4256 In a more complex server farm environment where you may have your
4257 frontend proxy server(s) on different machines, you will need to set a
4258 configuration option to tell Catalyst to read the proxied data from the
4259 headers.
4260
4261     MyApp->config(using_frontend_proxy => 1);
4262
4263 If you do not wish to use the proxy support at all, you may set:
4264
4265     MyApp->config(ignore_frontend_proxy => 0);
4266
4267 =head2 Note about psgi files
4268
4269 Note that if you supply your own .psgi file, calling
4270 C<< MyApp->psgi_app(@_); >>, then B<this will not happen automatically>.
4271
4272 You either need to apply L<Plack::Middleware::ReverseProxy> yourself
4273 in your psgi, for example:
4274
4275     builder {
4276         enable "Plack::Middleware::ReverseProxy";
4277         MyApp->psgi_app
4278     };
4279
4280 This will unconditionally add the ReverseProxy support, or you need to call
4281 C<< $app = MyApp->apply_default_middlewares($app) >> (to conditionally
4282 apply the support depending upon your config).
4283
4284 See L<Catalyst::PSGI> for more information.
4285
4286 =head1 THREAD SAFETY
4287
4288 Catalyst has been tested under Apache 2's threading C<mpm_worker>,
4289 C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
4290 believe the Catalyst core to be thread-safe.
4291
4292 If you plan to operate in a threaded environment, remember that all other
4293 modules you are using must also be thread-safe. Some modules, most notably
4294 L<DBD::SQLite>, are not thread-safe.
4295
4296 =head1 DATA HANDLERS
4297
4298 The L<Catalyst::Request> object uses L<HTTP::Body> to populate 'classic' HTML
4299 form parameters and URL search query fields.  However it has become common
4300 for various alternative content types to be PUT or POSTed to your controllers
4301 and actions.  People working on RESTful APIs, or using AJAX often use JSON,
4302 XML and other content types when communicating with an application server.  In
4303 order to better support this use case, L<Catalyst> defines a global configuration
4304 option, C<data_handlers>, which lets you associate a content type with a coderef
4305 that parses that content type into something Perl can readily access.
4306
4307     package MyApp::Web;
4308  
4309     use Catalyst;
4310     use JSON::Maybe;
4311  
4312     __PACKAGE__->config(
4313       data_handlers => {
4314         'application/json' => sub { local $/; decode_json $_->getline },
4315       },
4316       ## Any other configuration.
4317     );
4318  
4319     __PACKAGE__->setup;
4320
4321 By default L<Catalyst> comes with a generic JSON data handler similar to the
4322 example given above, which uses L<JSON::Maybe> to provide either L<JSON::PP>
4323 (a pure Perl, dependency free JSON parser) or L<Cpanel::JSON::XS> if you have
4324 it installed (if you want the faster XS parser, add it to you project Makefile.PL
4325 or dist.ini, cpanfile, etc.)
4326
4327 The C<data_handlers> configuration is a hashref whose keys are HTTP Content-Types
4328 (matched against the incoming request type using a regexp such as to be case
4329 insensitive) and whose values are coderefs that receive a localized version of
4330 C<$_> which is a filehandle object pointing to received body.
4331
4332 This feature is considered an early access release and we reserve the right
4333 to alter the interface in order to provide a performant and secure solution to
4334 alternative request body content.  Your reports welcomed!
4335
4336 =head1 PSGI MIDDLEWARE
4337
4338 You can define middleware, defined as L<Plack::Middleware> or a compatible
4339 interface in configuration.  Your middleware definitions are in the form of an
4340 arrayref under the configuration key C<psgi_middleware>.  Here's an example
4341 with details to follow:
4342
4343     package MyApp::Web;
4344  
4345     use Catalyst;
4346     use Plack::Middleware::StackTrace;
4347  
4348     my $stacktrace_middleware = Plack::Middleware::StackTrace->new;
4349  
4350     __PACKAGE__->config(
4351       'psgi_middleware', [
4352         'Debug',
4353         '+MyApp::Custom',
4354         $stacktrace_middleware,
4355         'Session' => {store => 'File'},
4356         sub {
4357           my $app = shift;
4358           return sub {
4359             my $env = shift;
4360             $env->{myapp.customkey} = 'helloworld';
4361             $app->($env);
4362           },
4363         },
4364       ],
4365     );
4366  
4367     __PACKAGE__->setup;
4368
4369 So the general form is:
4370
4371     __PACKAGE__->config(psgi_middleware => \@middleware_definitions);
4372
4373 Where C<@middleware> is one or more of the following, applied in the REVERSE of
4374 the order listed (to make it function similarly to L<Plack::Builder>:
4375
4376 Alternatively, you may also define middleware by calling the L</setup_middleware>
4377 package method:
4378
4379     package MyApp::Web;
4380
4381     use Catalyst;
4382
4383     __PACKAGE__->setup_middleware( \@middleware_definitions);
4384     __PACKAGE__->setup;
4385
4386 In the case where you do both (use 'setup_middleware' and configuration) the
4387 package call to setup_middleware will be applied earlier (in other words its
4388 middleware will wrap closer to the application).  Keep this in mind since in
4389 some cases the order of middleware is important.
4390
4391 The two approaches are not exclusive.
4392  
4393 =over 4
4394  
4395 =item Middleware Object
4396  
4397 An already initialized object that conforms to the L<Plack::Middleware>
4398 specification:
4399  
4400     my $stacktrace_middleware = Plack::Middleware::StackTrace->new;
4401  
4402     __PACKAGE__->config(
4403       'psgi_middleware', [
4404         $stacktrace_middleware,
4405       ]);
4406  
4407  
4408 =item coderef
4409  
4410 A coderef that is an inlined middleware:
4411  
4412     __PACKAGE__->config(
4413       'psgi_middleware', [
4414         sub {
4415           my $app = shift;
4416           return sub {
4417             my $env = shift;
4418             if($env->{PATH_INFO} =~m/forced/) {
4419               Plack::App::File
4420                 ->new(file=>TestApp->path_to(qw/share static forced.txt/))
4421                 ->call($env);
4422             } else {
4423               return $app->($env);
4424             }
4425          },
4426       },
4427     ]);
4428  
4429  
4430  
4431 =item a scalar
4432  
4433 We assume the scalar refers to a namespace after normalizing it using the
4434 following rules:
4435
4436 (1) If the scalar is prefixed with a "+" (as in C<+MyApp::Foo>) then the full string
4437 is assumed to be 'as is', and we just install and use the middleware.
4438
4439 (2) If the scalar begins with "Plack::Middleware" or your application namespace
4440 (the package name of your Catalyst application subclass), we also assume then
4441 that it is a full namespace, and use it.
4442
4443 (3) Lastly, we then assume that the scalar is a partial namespace, and attempt to
4444 resolve it first by looking for it under your application namespace (for example
4445 if you application is "MyApp::Web" and the scalar is "MyMiddleware", we'd look
4446 under "MyApp::Web::Middleware::MyMiddleware") and if we don't find it there, we
4447 will then look under the regular L<Plack::Middleware> namespace (i.e. for the
4448 previous we'd try "Plack::Middleware::MyMiddleware").  We look under your application
4449 namespace first to let you 'override' common L<Plack::Middleware> locally, should
4450 you find that a good idea.
4451
4452 Examples:
4453
4454     package MyApp::Web;
4455
4456     __PACKAGE__->config(
4457       'psgi_middleware', [
4458         'Debug',  ## MyAppWeb::Middleware::Debug->wrap or Plack::Middleware::Debug->wrap
4459         'Plack::Middleware::Stacktrace', ## Plack::Middleware::Stacktrace->wrap
4460         '+MyApp::Custom',  ## MyApp::Custom->wrap
4461       ],
4462     );
4463  
4464 =item a scalar followed by a hashref
4465  
4466 Just like the previous, except the following C<HashRef> is used as arguments
4467 to initialize the middleware object.
4468  
4469     __PACKAGE__->config(
4470       'psgi_middleware', [
4471          'Session' => {store => 'File'},
4472     ]);
4473
4474 =back
4475
4476 Please see L<PSGI> for more on middleware.
4477
4478 =head1 ENCODING
4479
4480 Starting in L<Catalyst> version 5.90080 encoding is automatically enabled
4481 and set to encode all body responses to UTF8 when possible and applicable.
4482 Following is documentation on this process.  If you are using an older
4483 version of L<Catalyst> you should review documentation for that version since
4484 a lot has changed.
4485
4486 By default encoding is now 'UTF-8'.  You may turn it off by setting
4487 the encoding configuration to undef.
4488
4489     MyApp->config(encoding => undef);
4490
4491 This is recommended for temporary backwards compatibility only.
4492
4493 Encoding is automatically applied when the content-type is set to
4494 a type that can be encoded.  Currently we encode when the content type
4495 matches the following regular expression:
4496
4497     $content_type =~ /^text|xml$|javascript$/
4498
4499 Encoding is set on the application, but it is copied to the context object
4500 so that you can override it on a request basis.
4501
4502 Be default we don't automatically encode 'application/json' since the most
4503 common approaches to generating this type of response (Either via L<Catalyst::View::JSON>
4504 or L<Catalyst::Action::REST>) will do so already and we want to avoid double
4505 encoding issues.
4506
4507 If you are producing JSON response in an unconventional manner (such
4508 as via a template or manual strings) you should perform the UTF8 encoding
4509 manually as well such as to conform to the JSON specification.
4510
4511 NOTE: We also examine the value of $c->response->content_encoding.  If
4512 you set this (like for example 'gzip', and manually gzipping the body)
4513 we assume that you have done all the necessary encoding yourself, since
4514 we cannot encode the gzipped contents.  If you use a plugin like
4515 L<Catalyst::Plugin::Compress> you need to update to a modern version in order
4516 to have this function correctly  with the new UTF8 encoding code, or you
4517 can use L<Plack::Middleware::Deflater> or (probably best) do your compression on
4518 a front end proxy.
4519
4520 =head2 Methods
4521
4522 =over 4
4523
4524 =item encoding
4525
4526 Returns an instance of an C<Encode> encoding
4527
4528     print $c->encoding->name
4529
4530 =item handle_unicode_encoding_exception ($exception_context)
4531
4532 Method called when decoding process for a request fails.
4533
4534 An C<$exception_context> hashref is provided to allow you to override the
4535 behaviour of your application when given data with incorrect encodings.
4536
4537 The default method throws exceptions in the case of invalid request parameters
4538 (resulting in a 500 error), but ignores errors in upload filenames.
4539
4540 The keys passed in the C<$exception_context> hash are:
4541
4542 =over
4543
4544 =item param_value
4545
4546 The value which was not able to be decoded.
4547
4548 =item error_msg
4549
4550 The exception received from L<Encode>.
4551
4552 =item encoding_step
4553
4554 What type of data was being decoded. Valid values are (currently)
4555 C<params> - for request parameters / arguments / captures
4556 and C<uploads> - for request upload filenames.
4557
4558 =back
4559
4560 =back
4561
4562 =head1 SUPPORT
4563
4564 IRC:
4565
4566     Join #catalyst on irc.perl.org.
4567
4568 Mailing Lists:
4569
4570     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
4571     http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst-dev
4572
4573 Web:
4574
4575     http://catalyst.perl.org
4576
4577 Wiki:
4578
4579     http://dev.catalyst.perl.org
4580
4581 =head1 SEE ALSO
4582
4583 =head2 L<Task::Catalyst> - All you need to start with Catalyst
4584
4585 =head2 L<Catalyst::Manual> - The Catalyst Manual
4586
4587 =head2 L<Catalyst::Component>, L<Catalyst::Controller> - Base classes for components
4588
4589 =head2 L<Catalyst::Engine> - Core engine
4590
4591 =head2 L<Catalyst::Log> - Log class.
4592
4593 =head2 L<Catalyst::Request> - Request object
4594
4595 =head2 L<Catalyst::Response> - Response object
4596
4597 =head2 L<Catalyst::Test> - The test suite.
4598
4599 =head1 PROJECT FOUNDER
4600
4601 sri: Sebastian Riedel <sri@cpan.org>
4602
4603 =head1 CONTRIBUTORS
4604
4605 abw: Andy Wardley
4606
4607 acme: Leon Brocard <leon@astray.com>
4608
4609 abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
4610
4611 andrewalker: André Walker <andre@cpan.org>
4612
4613 Andrew Bramble
4614
4615 Andrew Ford E<lt>A.Ford@ford-mason.co.ukE<gt>
4616
4617 Andrew Ruthven
4618
4619 andyg: Andy Grundman <andy@hybridized.org>
4620
4621 audreyt: Audrey Tang
4622
4623 bricas: Brian Cassidy <bricas@cpan.org>
4624
4625 Caelum: Rafael Kitover <rkitover@io.com>
4626
4627 chansen: Christian Hansen
4628
4629 chicks: Christopher Hicks
4630
4631 Chisel Wright C<pause@herlpacker.co.uk>
4632
4633 Danijel Milicevic C<me@danijel.de>
4634
4635 davewood: David Schmidt <davewood@cpan.org>
4636
4637 David Kamholz E<lt>dkamholz@cpan.orgE<gt>
4638
4639 David Naughton, C<naughton@umn.edu>
4640
4641 David E. Wheeler
4642
4643 dhoss: Devin Austin <dhoss@cpan.org>
4644
4645 dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
4646
4647 Drew Taylor
4648
4649 dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
4650
4651 esskar: Sascha Kiefer
4652
4653 fireartist: Carl Franks <cfranks@cpan.org>
4654
4655 frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
4656
4657 gabb: Danijel Milicevic
4658
4659 Gary Ashton Jones
4660
4661 Gavin Henry C<ghenry@perl.me.uk>
4662
4663 Geoff Richards
4664
4665 groditi: Guillermo Roditi <groditi@gmail.com>
4666
4667 hobbs: Andrew Rodland <andrew@cleverdomain.org>
4668
4669 ilmari: Dagfinn Ilmari MannsÃ¥ker <ilmari@ilmari.org>
4670
4671 jcamacho: Juan Camacho
4672
4673 jester: Jesse Sheidlower C<jester@panix.com>
4674
4675 jhannah: Jay Hannah <jay@jays.net>
4676
4677 Jody Belka
4678
4679 Johan Lindstrom
4680
4681 jon: Jon Schutz <jjschutz@cpan.org>
4682
4683 Jonathan Rockway C<< <jrockway@cpan.org> >>
4684
4685 Kieren Diment C<kd@totaldatasolution.com>
4686
4687 konobi: Scott McWhirter <konobi@cpan.org>
4688
4689 marcus: Marcus Ramberg <mramberg@cpan.org>
4690
4691 miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
4692
4693 mgrimes: Mark Grimes <mgrimes@cpan.org>
4694
4695 mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
4696
4697 mugwump: Sam Vilain
4698
4699 naughton: David Naughton
4700
4701 ningu: David Kamholz <dkamholz@cpan.org>
4702
4703 nothingmuch: Yuval Kogman <nothingmuch@woobling.org>
4704
4705 numa: Dan Sully <daniel@cpan.org>
4706
4707 obra: Jesse Vincent
4708
4709 Octavian Rasnita
4710
4711 omega: Andreas Marienborg
4712
4713 Oleg Kostyuk <cub.uanic@gmail.com>
4714
4715 phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
4716
4717 rafl: Florian Ragwitz <rafl@debian.org>
4718
4719 random: Roland Lammel <lammel@cpan.org>
4720
4721 Robert Sedlacek C<< <rs@474.at> >>
4722
4723 SpiceMan: Marcel Montes
4724
4725 sky: Arthur Bergman
4726
4727 szbalint: Balint Szilakszi <szbalint@cpan.org>
4728
4729 t0m: Tomas Doran <bobtfish@bobtfish.net>
4730
4731 Ulf Edvinsson
4732
4733 vanstyn: Henry Van Styn <vanstyn@cpan.org>
4734
4735 Viljo Marrandi C<vilts@yahoo.com>
4736
4737 Will Hawes C<info@whawes.co.uk>
4738
4739 willert: Sebastian Willert <willert@cpan.org>
4740
4741 wreis: Wallace Reis <wreis@cpan.org>
4742
4743 Yuval Kogman, C<nothingmuch@woobling.org>
4744
4745 rainboxx: Matthias Dietrich, C<perl@rainboxx.de>
4746
4747 dd070: Dhaval Dhanani <dhaval070@gmail.com>
4748
4749 Upasana <me@upasana.me>
4750
4751 John Napiorkowski (jnap) <jjnapiork@cpan.org>
4752
4753 =head1 COPYRIGHT
4754
4755 Copyright (c) 2005-2015, the above named PROJECT FOUNDER and CONTRIBUTORS.
4756
4757 =head1 LICENSE
4758
4759 This library is free software. You can redistribute it and/or modify it under
4760 the same terms as Perl itself.
4761
4762 =cut
4763
4764 no Moose;
4765
4766 __PACKAGE__->meta->make_immutable;
4767
4768 1;