From: Tomas Doran
Date: Wed, 28 Jul 2010 22:50:57 +0000 (+0000)
Subject: Merge 'trunk' into 'fix_iis_cgi'
X-Git-Tag: 5.80025~2
X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=fef8c827fc1a87b1c32c487e330b5e967874f581;hp=a49001028fac795b862b62c24092510c02b6ae9d
Merge 'trunk' into 'fix_iis_cgi'
r13096@spaceinvaders (orig r13060): rafl | 2010-03-22 10:30:30 +0000
It's --help, not -help.
r13098@spaceinvaders (orig r13062): miyagawa | 2010-03-22 11:07:22 +0000
added cpanm :)
r13099@spaceinvaders (orig r13063): ijw | 2010-03-22 11:30:38 +0000
Disabled name lookup for server hostname in favour of returning IP address. Annoyingly, I can't find any actual use of the name in this module (it's passed as SERVER_NAME in the env), but we believe it ends up in the 'Host' header.
r13100@spaceinvaders (orig r13064): rafl | 2010-03-22 12:32:25 +0000
no tabs. kthx!
r13118@spaceinvaders (orig r13082): rafl | 2010-03-26 16:00:54 +0000
Make sure to construct Upload objects properly, even if there are multiple Content-Type headers.
Closes RT#55976.
r13119@spaceinvaders (orig r13083): t0m | 2010-03-28 17:43:37 +0100
Back out 13063. This changes the CGI environment we construct to just be plain wrong, SERVER_NAME is meant to be a name after all. I have a feeling that all of this crap could be simplified, but I don't want to spend a lot of tuits changing it (and possibly breaking things for people with non-obvious behaviour changes like this one) - when those tuits could be spent on Plack stuff so that all this code dies anyway (and we do a major release so breakage can be more reasonable expected / extensively tested for). This is all possibly being _too_ paranoid here, but given the original commit didn't know what was happening / what changed _at all_, I think that's fair..
r13120@spaceinvaders (orig r13084): t0m | 2010-03-28 17:54:36 +0100
Cache the IP address => hostname lookups which could be performed multiple times to mitigate slow DNS servers. Poor man's replacement for 13063
r13121@spaceinvaders (orig r13085): t0m | 2010-03-28 18:24:18 +0100
Back out behaviour change in debug logging we don't want, keeping only the addition of 1 line of response info. More refactoring to give hooks to put the behaviour I just removed back from a plugin
r13122@spaceinvaders (orig r13086): t0m | 2010-03-28 19:18:45 +0100
More splitting up of the response logging methods
r13123@spaceinvaders (orig r13087): t0m | 2010-03-28 19:25:41 +0100
Make the tables from the log_headers method scale to term size nicely
r13139@spaceinvaders (orig r13103): t0m | 2010-03-29 16:55:39 +0100
Fail, commit version bump
r13142@spaceinvaders (orig r13106): rafl | 2010-03-29 17:09:05 +0100
Remove $VERSION hacks.
For future dev releases we'll just use "-TRIAL" in the dist name.
r13143@spaceinvaders (orig r13107): rafl | 2010-03-29 17:19:15 +0100
We always have a metaclass after setup, right?
r13152@spaceinvaders (orig r13116): t0m | 2010-03-31 21:09:17 +0100
Adding ability to switch X-Catalyst on by config. For everyone who would like to let Netcraft know how awesome Catalyst is. (Sorry rafl...)
r13157@spaceinvaders (orig r13121): rafl | 2010-04-02 00:30:06 +0100
Import croak, which the test already uses in various places.
r13160@spaceinvaders (orig r13124): t0m | 2010-04-02 19:27:33 +0100
Require new CGI::Simple::Cookie, changelog
r13187@spaceinvaders (orig r13151): t0m | 2010-04-12 20:16:39 +0100
Fix dsadinoff's mod_rewrite bug I hope
r13188@spaceinvaders (orig r13152): t0m | 2010-04-12 20:18:04 +0100
Revert unintentional change in r13151
r13191@spaceinvaders (orig r13155): t0m | 2010-04-13 22:03:58 +0100
Fix spelling errors - RT#54335
r13192@spaceinvaders (orig r13156): t0m | 2010-04-13 23:06:19 +0100
Fix RT#41442 so that temporary files are always, always cleaned up.
r13193@spaceinvaders (orig r13157): t0m | 2010-04-13 23:12:13 +0100
Document return of C::T::get is bytes not characters, RT#53678
r13194@spaceinvaders (orig r13158): t0m | 2010-04-13 23:18:19 +0100
Fix RT#49267
r13195@spaceinvaders (orig r13159): t0m | 2010-04-13 23:29:10 +0100
Trivial test feature, fixes RT#53653
r13202@spaceinvaders (orig r13166): t0m | 2010-04-19 00:03:56 +0100
Fix unquoted regex as per RT#24951
r13205@spaceinvaders (orig r13169): t0m | 2010-04-19 03:40:24 +0100
Document the action config here, as people don't seem to find it and this may help..
r13206@spaceinvaders (orig r13170): t0m | 2010-04-19 03:41:57 +0100
Bah, accidentally removed..
r13207@spaceinvaders (orig r13171): t0m | 2010-04-19 08:22:49 +0100
Go away useless warning
r13213@spaceinvaders (orig r13177): ajgb | 2010-04-21 12:10:51 +0100
Fix not stripping backslashes in DispatchType::Regex::uri_for_action
r15483@spaceinvaders (orig r13190): rafl | 2010-04-28 23:54:04 +0100
Make sure path_to returns an instance of the right Path::Class class.
r15484@spaceinvaders (orig r13191): edenc | 2010-04-29 00:29:02 +0100
minor documentation fix for handle_request
r15489@spaceinvaders (orig r13193): rafl | 2010-05-03 00:16:25 +0100
Allow parameterized roles to be applied as plugins.
r15490@spaceinvaders (orig r13194): t0m | 2010-05-03 00:27:43 +0100
Back out crazy heuristics
r15492@spaceinvaders (orig r13196): rafl | 2010-05-03 00:44:30 +0100
Unbreak tests by actually adding the module they're supposed to test.
r15494@spaceinvaders (orig r13198): rafl | 2010-05-03 01:51:43 +0100
Remove useless conditional.
r15515@spaceinvaders (orig r13219): wreis | 2010-05-06 13:34:10 +0100
make uri_for a bit cleaner
r15516@spaceinvaders (orig r13220): wreis | 2010-05-06 14:30:19 +0100
minor fix for Changes file | add me as a contributor
r15517@spaceinvaders (orig r13221): rafl | 2010-05-07 22:11:10 +0100
Pass along options to load_class for plugins.
r15518@spaceinvaders (orig r13222): rafl | 2010-05-07 22:48:51 +0100
Changelogging.
r15519@spaceinvaders (orig r13223): rafl | 2010-05-07 23:06:26 +0100
Version 5.80023.
r15535@spaceinvaders (orig r13239): ribasushi | 2010-05-12 12:48:40 +0100
Better stats API explanation (SpiceMan)
r15559@spaceinvaders (orig r13263): t0m | 2010-05-15 10:42:58 +0100
r13208@spaceinvaders (orig r13172): t0m | 2010-04-19 09:54:56 +0200
Branch to try and fix the request uri stuff.
r13209@spaceinvaders (orig r13173): t0m | 2010-04-19 09:58:37 +0200
Just add comments to tests, no functional changes
r13210@spaceinvaders (orig r13174): t0m | 2010-04-19 09:59:14 +0200
Get it mostly working, except uri_for is still buggered
r15488@spaceinvaders (orig r13192): t0m | 2010-05-03 00:26:22 +0200
Revert to old behaviour, allow config for new behaviour. Config option name is rubbish, needs fixing
r15532@spaceinvaders (orig r13236): t0m | 2010-05-09 01:09:01 +0200
I hate this name less. Others may feel differently
r15556@spaceinvaders (orig r13260): t0m | 2010-05-15 10:52:16 +0200
Simplify madness some more, back to how it looked in the original fix_path_info_decoding branch so that we aren't using dodgy heuristics to determine the path. Alter the prepare_path tests so that they're testing the appropriate config option so that we now have tests for both code paths
r15557@spaceinvaders (orig r13261): t0m | 2010-05-15 11:20:16 +0200
Add a pile of docs for the new use_request_uri_for_path setting
r15558@spaceinvaders (orig r13262): t0m | 2010-05-15 11:38:06 +0200
Add recommendation
r15560@spaceinvaders (orig r13264): t0m | 2010-05-15 10:55:07 +0100
Changelog, bump versions, add new contributor :)
r15567@spaceinvaders (orig r13271): jhannah | 2010-05-19 23:36:21 +0100
We appear to have a bug where if lazy => 1 isn't set an exception
occurs.
r15575@spaceinvaders (orig r13279): jhannah | 2010-05-20 20:46:31 +0100
Oops. I should have TODO'd this one. rafl++
r15577@spaceinvaders (orig r13281): t0m | 2010-05-20 21:31:39 +0100
r13203@t0mlaptop (orig r13167): t0m | 2010-04-19 02:57:27 +0100
Branch for doys upcoming metaclass compat fixes.
r13204@t0mlaptop (orig r13168): t0m | 2010-04-19 03:02:36 +0100
Remove the fugly hack to avoid metaclass compat issues now that Moose is fixed
r15584@spaceinvaders (orig r13282): t0m | 2010-05-20 21:34:34 +0100
Changelog and dep bump for more_metaclass_compat branch merge
r15585@spaceinvaders (orig r13283): t0m | 2010-05-20 21:35:20 +0100
Back out hunks I accidentally committed
r15598@spaceinvaders (orig r13296): t0m | 2010-05-22 11:17:18 +0100
Changelog, bump Moose dep
r15599@spaceinvaders (orig r13297): t0m | 2010-05-22 11:18:14 +0100
r15581@spaceinvaders: t0m | 2010-05-21 18:11:33 +0100
Mech tests branch
r15582@spaceinvaders: t0m | 2010-05-21 18:20:01 +0100
Fix --mech as reportedon list as 'create controller 'option' -mechanize fails'
r15583@spaceinvaders: t0m | 2010-05-21 18:21:18 +0100
Fix missing - in option, options must be --
r15645@spaceinvaders (orig r13336): t0m | 2010-06-10 10:54:11 +0100
Fix $self vs $class, davewood++
r15660@spaceinvaders (orig r13351): rainboxx | 2010-06-15 12:53:05 +0100
Applied doc patches that might help to figure out how to receive component's config values.
r15672@spaceinvaders (orig r13363): jester | 2010-06-22 21:47:45 +0100
Fixed typo
r15674@spaceinvaders (orig r13365): bricas | 2010-06-24 13:52:20 +0100
add typo fix to Changes
r15689@spaceinvaders (orig r13380): arcanez | 2010-07-03 01:04:07 +0100
remove extra '
r15716@spaceinvaders (orig r13407): hobbs | 2010-07-09 10:40:44 +0100
Try harder to make finalize_error encoding-safe.
r15750@spaceinvaders (orig r13441): t0m | 2010-07-28 22:39:41 +0100
r15666@spaceinvaders (orig r13357): jnapiorkowski | 2010-06-16 20:12:46 +0100
new branch
r15667@spaceinvaders (orig r13358): jnapiorkowski | 2010-06-16 20:55:08 +0100
broke out and documented action_class method
r15749@spaceinvaders (orig r13440): t0m | 2010-07-28 22:39:32 +0100
Changelog
r15755@spaceinvaders (orig r13446): t0m | 2010-07-28 23:00:14 +0100
r15662@spaceinvaders (orig r13353): t0m | 2010-06-15 22:15:31 +0100
Branch for rt58057
r15663@spaceinvaders (orig r13354): t0m | 2010-06-15 22:17:32 +0100
Commit standalone test, test which makes the TestApp blow up and the nasty workaround
r15726@spaceinvaders (orig r13417): t0m | 2010-07-23 13:29:21 +0100
I know hobbs has a patch to add a load of these, but we should at least add (es)
r15753@spaceinvaders (orig r13444): t0m | 2010-07-28 22:56:25 +0100
Entirely the wrong branch, idiot. Remove r13417
r15754@spaceinvaders (orig r13445): t0m | 2010-07-28 23:00:05 +0100
Document the horrible, changelog. I'm going to merge this and fix a real issue as I don't have time to fuck around inside Moose right now and it's been waiting way too long already
r15756@spaceinvaders (orig r13447): t0m | 2010-07-28 23:26:21 +0100
Fix TODO tests.
r15757@spaceinvaders (orig r13448): t0m | 2010-07-28 23:26:31 +0100
Whitespace
---
diff --git a/Changes b/Changes
index ead2c17..0eee575 100644
--- a/Changes
+++ b/Changes
@@ -1,25 +1,105 @@
# This file documents the revision history for Perl extension Catalyst.
+ New features:
+ - An 'action_class' method has been added to Catalyst::Controller to
+ allow controller base classes, roles or traits
+ (e.g. Catalyst::Controller::ActionRole) to more easily override
+ the default action creation.
+
+ Bug fixes:
+ - Fix the --mech and --mechanize options to the myapp_create.pl script
+ to operate correctly by fixing the options passed down into the script.
+ - Fix controllers with no method attributes (where the action definitions
+ are entirely contained in config). RT#58057
+
+ Documentation:
+ - Fix missing - in the docs when describing the --mechanize option at one
+ point.
+ - Explained the common practice how to access the component's config
+ values.
+ - Fixed typo in Catalyst/Script/Server.pm (RT #58474)
+
+5.80024 2010-05-15 11:55:44
+
+ Bug fixes:
+ - Revert the path resolution behaviour to how it used to work before
+ Catalyst 5.80014_02, so that application paths are (by default)
+ resolved from $ENV{PATH_INFO} and $ENV{SCRIPT_NAME}. This fixes backward
+ compatibility breakage seen by a number of people since that release
+ with mod_rewrite and SSI.
+
+ New features:
+ - Add a use_request_uri_for_path config setting to optionally
+ use the (more correct) $ENV{REQUEST_URI} path resolution behaviour.
+
+ Documentation:
+ - Clarify the documentation for the Catalyst::Stats interface.
+ - Copious documentation about the use_request_uri_for_path feature
+ and the implications of setting this to true/false in
+ Catalyst::Engine::CGI
+
+5.80023 2010-05-07 23:50:27
+
+ Bug fixes:
+ - Ensure to always cleanup temporary uploaded files in all cases, even
+ when exceptions occur during request processing, using HTTP::Body's
+ ->cleanup feature. (RT#41442)
+ - Ensure that Catalyst::Engine::HTTP's options hash is defined before
+ dereferencing it. (RT#49267)
+ - Fix regex special characters in REDIRECT_URL variable breaking
+ the request base. (2nd part of RT#24951)
+ - Fix not stripping backslashes in DispatchType::Regex::uri_for_action
+
+ New features:
+ - Setting __PACKAGE__->config(enable_catalyst_header => 1); in your MyApp.pm
+ now enables the X-Catalyst header being printed when not in debug mode.
+ - Require CGI::Simple::Cookie version 1.109 to ensure support for the
+ HttpOnly flag
+ - Allow the myapp_test.pl script to be given a list of paths which it
+ will retrieve all of. (RT#53653)
+ - Allow parameterized roles to be applied as plugins.
+ - Allow requiring minimum versions of plugins when loading them.
+
+ Documentation:
+ - The Catalyst::Test::get method is documented as returning the raw
+ response bytes without any character decoding (RT#53678)
+
+ Cleanups:
+ - Removal of $Catalyst::PRETTY_VERSION. Future releases will always have the
+ full and unmangled version number, including trailing zeroes, in
+ $Catalyst::VERSION.
+
+5.80022 2010-03-28 19:43:01
+
New features:
- Log an extra line in debug mode with the response status code,
the content type and content length if available.
Refactoring / optimizations:
- Display of the end of hit debug messages has been factored out into
- log_headers, log_request and log_response methods which all call
+ log_headers, log_request, log_request_headers, log_response,
+ log_response_status_line and log_response_headers methods so that
+ plugins which customise how much information is shown on the debug
+ screen as easy to write.
+ - Make all logging of request and response state get the information from
$c->dump_these so that there is a unified point from which to hook
in parameter filtering (for example).
- $c->model/view/controller have become a lot faster for non-regexp names
by using direct hash lookup instead of looping.
+ - IP address => hostname mapping for the server is only done once and cached
+ by Catalyst::Engine::HTTP to somewhat mitigate the problem of people
+ developing on machines pointed at slow DNS servers.
- Bug fixed:
+ Bugs fixed:
- DispatchType::Index's uri_for_action only returns for actions registered
with it (prevents 'index :Path' or similar resolving to the wrong URI)
+ - Make sure to construct Upload objects properly, even if there are
+ multiple Content-Type headers (Closes RT#55976).
5.80021 2010-03-03 23:02:01
Bug fixed:
- - $c->uri_for will now escape unsafe characterss in captures
+ - $c->uri_for will now escape unsafe characters in captures
($c->request->captures) and correctly encode utf8 charracters.
5.80020 2010-02-04 06:51:18
diff --git a/Makefile.PL b/Makefile.PL
index 568ea2c..3b2305c 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -19,15 +19,16 @@ requires 'namespace::clean' => '0.13';
requires 'B::Hooks::EndOfScope' => '0.08';
requires 'MooseX::Emulate::Class::Accessor::Fast' => '0.00903';
requires 'Class::MOP' => '0.95';
-requires 'Moose' => '0.93';
+requires 'Moose' => '1.03';
requires 'MooseX::MethodAttributes::Inheritable' => '0.19';
requires 'MooseX::Role::WithOverloading' => '0.05';
requires 'Carp';
requires 'Class::C3::Adopt::NEXT' => '0.07';
-requires 'CGI::Simple::Cookie';
+requires 'CGI::Simple::Cookie' => '1.109';
requires 'Data::Dump';
+requires 'Data::OptList';
requires 'HTML::Entities';
-requires 'HTTP::Body' => '1.04'; # makes uploadtmp work
+requires 'HTTP::Body' => '1.06'; # ->cleanup(1)
requires 'HTTP::Headers' => '1.64';
requires 'HTTP::Request' => '5.814';
requires 'HTTP::Response' => '5.813';
@@ -101,7 +102,8 @@ print <<"EOF";
you also install the development tools package Catalyst::Devel.
perl -MCPANPLUS -e 'install Catalyst::Devel' # or
- perl -MCPAN -e 'install Catalyst::Devel'
+ perl -MCPAN -e 'install Catalyst::Devel' # or
+ cpanm Catalyst::Devel
To get some commonly used plugins, as well as the TT view and DBIC
model, install Task::Catalyst in the same way.
diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm
index 3a43f54..1013d21 100644
--- a/lib/Catalyst.pm
+++ b/lib/Catalyst.pm
@@ -14,6 +14,7 @@ use Catalyst::Request::Upload;
use Catalyst::Response;
use Catalyst::Utils;
use Catalyst::Controller;
+use Data::OptList;
use Devel::InnerPackage ();
use File::stat;
use Module::Pluggable::Object ();
@@ -78,10 +79,7 @@ __PACKAGE__->stats_class('Catalyst::Stats');
# Remember to update this in Catalyst::Runtime as well!
-our $VERSION = '5.80021';
-our $PRETTY_VERSION = $VERSION;
-
-$VERSION = eval $VERSION;
+our $VERSION = '5.80024';
sub import {
my ( $class, @arguments ) = @_;
@@ -283,14 +281,15 @@ Specifies a comma-delimited list of log levels.
=head2 -Stats
-Enables statistics collection and reporting. You can also force this setting
-from the system environment with CATALYST_STATS or _STATS. The
-environment settings override the application, with _STATS having the
-highest priority.
+Enables statistics collection and reporting.
+
+ use Catalyst qw/-Stats=1/;
-e.g.
+You can also force this setting from the system environment with CATALYST_STATS
+or _STATS. The environment settings override the application, with
+_STATS having the highest priority.
- use Catalyst qw/-Stats=1/
+Stats are also enabled if L<< debugging |/"-Debug" >> is enabled.
=head1 METHODS
@@ -893,7 +892,7 @@ component is constructed.
For example:
MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
- MyApp::Model::Foo->config({ quux => 'frob', 'overrides => 'this' });
+ MyApp::Model::Foo->config({ quux => 'frob', overrides => 'this' });
will mean that C receives the following data when
constructed:
@@ -904,6 +903,21 @@ constructed:
overrides => 'me',
});
+It's common practice to use a Moose attribute
+on the receiving component to access the config value.
+
+ package MyApp::Model::Foo;
+
+ use Moose;
+
+ # this attr will receive 'baz' at construction time
+ has 'bar' => (
+ is => 'rw',
+ isa => 'Str',
+ );
+
+You can then get the value 'baz' by calling $c->model('Foo')->bar
+
=cut
around config => sub {
@@ -1162,7 +1176,7 @@ EOF
if ( $class->debug ) {
my $name = $class->config->{name} || 'Application';
- $class->log->info("$name powered by Catalyst $Catalyst::PRETTY_VERSION");
+ $class->log->info("$name powered by Catalyst $Catalyst::VERSION");
}
# Make sure that the application class becomes immutable at this point,
@@ -1282,13 +1296,11 @@ sub uri_for {
carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
foreach my $arg (@args) {
utf8::encode($arg) if utf8::is_utf8($arg);
- }
- s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
- if (blessed $path) { # Action object only.
- s|/|%2F|g for @args;
+ $arg =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
}
if ( blessed($path) ) { # action object
+ s|/|%2F|g for @args;
my $captures = [ map { s|/|%2F|g; $_; }
( scalar @args && ref $args[0] eq 'ARRAY'
? @{ shift(@args) }
@@ -1309,8 +1321,6 @@ sub uri_for {
$path = '/' if $path eq '';
}
- undef($path) if (defined $path && $path eq '');
-
unshift(@args, $path);
unless (defined $path && $path =~ s!^/!!) { # in-place strip
@@ -1516,7 +1526,7 @@ sub welcome_message {
models, and
views;
they can save you a lot of work.
- script/${prefix}_create.pl -help
+ script/${prefix}_create.pl --help
Also, be sure to check out the vast and growing
collection of plugins for Catalyst on CPAN;
you are likely to find what you need there.
@@ -1893,7 +1903,7 @@ namespaces.
sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
-=head2 $c->handle_request( $class, @arguments )
+=head2 $app->handle_request( @arguments )
Called to handle each HTTP request.
@@ -1953,7 +1963,7 @@ sub prepare {
#surely this is not the most efficient way to do things...
$c->stats($class->stats_class->new)->enable($c->use_stats);
- if ( $c->debug ) {
+ if ( $c->debug || $c->config->{enable_catalyst_header} ) {
$c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
}
@@ -2108,8 +2118,6 @@ Writes information about the request to the debug logs. This includes:
=item * Request method, path, and remote IP address
-=item * Request headers (see L)
-
=item * Query keywords (see L)
=item * Request parameters
@@ -2134,7 +2142,7 @@ sub log_request {
$address ||= '';
$c->log->debug(qq/"$method" request for "$path" from "$address"/);
- $c->log_headers('request', $request->headers);
+ $c->log_request_headers($request->headers);
if ( my $keywords = $request->query_keywords ) {
$c->log->debug("Query keywords are: $keywords");
@@ -2147,35 +2155,60 @@ sub log_request {
=head2 $c->log_response
-Writes information about the response to the debug logs. This includes:
+Writes information about the response to the debug logs by calling
+C<< $c->log_response_status_line >> and C<< $c->log_response_headers >>.
+
+=cut
+
+sub log_response {
+ my $c = shift;
+
+ return unless $c->debug;
+
+ my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these;
+ my $response = $dump->[1];
+
+ $c->log_response_status_line($response);
+ $c->log_response_headers($response->headers);
+}
+
+=head2 $c->log_response_status_line($response)
+
+Writes one line of information about the response to the debug logs. This includes:
=over 4
=item * Response status code
-=item * Response headers (see L)
+=item * Content-Type header (if present)
+
+=item * Content-Length header (if present)
=back
=cut
-sub log_response {
- my $c = shift;
+sub log_response_status_line {
+ my ($c, $response) = @_;
- return unless $c->debug;
+ $c->log->debug(
+ sprintf(
+ 'Response Code: %s; Content-Type: %s; Content-Length: %s',
+ $response->status || 'unknown',
+ $response->headers->header('Content-Type') || 'unknown',
+ $response->headers->header('Content-Length') || 'unknown'
+ )
+ );
+}
- my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these;
- my $response = $dump->[1];
+=head2 $c->log_response_headers($headers);
- $c->log->debug(
- sprintf(
- 'Response Code: %s; Content-Type: %s; Content-Length: %s',
- $response->status || 'unknown',
- $response->headers->header('Content-Type') || 'unknown',
- $response->headers->header('Content-Length') || 'unknown'
- )
- );
-}
+Hook method which can be wrapped by plugins to log the responseheaders.
+No-op in the default implementation.
+
+=cut
+
+sub log_response_headers {}
=head2 $c->log_request_parameters( query => {}, body => {} )
@@ -2233,6 +2266,15 @@ sub log_request_uploads {
}
}
+=head2 $c->log_request_headers($headers);
+
+Hook method which can be wrapped by plugins to log the request headers.
+No-op in the default implementation.
+
+=cut
+
+sub log_request_headers {}
+
=head2 $c->log_headers($type => $headers)
Logs L (either request or response) to the debug logs.
@@ -2246,7 +2288,8 @@ sub log_headers {
return unless $c->debug;
- my $t = Text::SimpleTable->new( [ 35, 'Header Name' ], [ 40, 'Value' ] );
+ my $column_width = Catalyst::Utils::term_width() - 28;
+ my $t = Text::SimpleTable->new( [ 15, 'Header Name' ], [ $column_width, 'Value' ] );
$headers->scan(
sub {
my ( $name, $value ) = @_;
@@ -2378,10 +2421,6 @@ sub setup_components {
# we know M::P::O found a file on disk so this is safe
Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
-
- # Needs to be done as soon as the component is loaded, as loading a sub-component
- # (next time round the loop) can cause us to get the wrong metaclass..
- $class->_controller_init_base_classes($component);
}
for my $component (@comps) {
@@ -2391,7 +2430,6 @@ sub setup_components {
: $class->expand_component_module( $component, $config );
for my $component (@expanded_components) {
next if $comps{$component};
- $class->_controller_init_base_classes($component); # Also cover inner packages
$class->components->{ $component } = $class->setup_component($component);
}
}
@@ -2444,19 +2482,6 @@ sub expand_component_module {
=cut
-# FIXME - Ugly, ugly hack to ensure the we force initialize non-moose base classes
-# nearest to Catalyst::Controller first, no matter what order stuff happens
-# to be loaded. There are TODO tests in Moose for this, see
-# f2391d17574eff81d911b97be15ea51080500003
-sub _controller_init_base_classes {
- my ($app_class, $component) = @_;
- return unless $component->isa('Catalyst::Controller');
- foreach my $class ( reverse @{ mro::get_linear_isa($component) } ) {
- Moose::Meta::Class->initialize( $class )
- unless find_meta($class);
- }
-}
-
sub setup_component {
my( $class, $component ) = @_;
@@ -2757,13 +2782,8 @@ the plugin name does not begin with C.
if $plugin->isa( 'Catalyst::Component' );
$proto->_plugins->{$plugin} = 1;
unless ($instant) {
- no strict 'refs';
- if ( my $meta = Class::MOP::get_metaclass_by_name($class) ) {
- my @superclasses = ($plugin, $meta->superclasses );
- $meta->superclasses(@superclasses);
- } else {
- unshift @{"$class\::ISA"}, $plugin;
- }
+ my $meta = Class::MOP::get_metaclass_by_name($class);
+ $meta->superclasses($plugin, $meta->superclasses);
}
return $class;
}
@@ -2772,22 +2792,29 @@ the plugin name does not begin with C.
my ( $class, $plugins ) = @_;
$class->_plugins( {} ) unless $class->_plugins;
- $plugins ||= [];
+ $plugins = Data::OptList::mkopt($plugins || []);
- my @plugins = Catalyst::Utils::resolve_namespace($class . '::Plugin', 'Catalyst::Plugin', @$plugins);
+ my @plugins = map {
+ [ Catalyst::Utils::resolve_namespace(
+ $class . '::Plugin',
+ 'Catalyst::Plugin', $_->[0]
+ ),
+ $_->[1],
+ ]
+ } @{ $plugins };
for my $plugin ( reverse @plugins ) {
- Class::MOP::load_class($plugin);
- my $meta = find_meta($plugin);
+ Class::MOP::load_class($plugin->[0], $plugin->[1]);
+ my $meta = find_meta($plugin->[0]);
next if $meta && $meta->isa('Moose::Meta::Role');
- $class->_register_plugin($plugin);
+ $class->_register_plugin($plugin->[0]);
}
my @roles =
- map { $_->name }
- grep { $_ && blessed($_) && $_->isa('Moose::Meta::Role') }
- map { find_meta($_) }
+ map { $_->[0]->name, $_->[1] }
+ grep { blessed($_->[0]) && $_->[0]->isa('Moose::Meta::Role') }
+ map { [find_meta($_->[0]), $_->[1]] }
@plugins;
Moose::Util::apply_all_roles(
@@ -2801,15 +2828,24 @@ the plugin name does not begin with C.
Returns an arrayref of the internal execution stack (actions that are
currently executing).
+=head2 $c->stats
+
+Returns the current timing statistics object. By default Catalyst uses
+L, but can be set otherwise with
+L<< stats_class|/"$c->stats_class" >>.
+
+Even if L<< -Stats|/"-Stats" >> is not enabled, the stats object is still
+available. By enabling it with C< $c->stats->enabled(1) >, it can be used to
+profile explicitly, although MyApp.pm still won't profile nor output anything
+by itself.
+
=head2 $c->stats_class
-Returns or sets the stats (timing statistics) class.
+Returns or sets the stats (timing statistics) class. L is used by default.
=head2 $c->use_stats
-Returns 1 when stats collection is enabled. Stats collection is enabled
-when the -Stats options is set, debug is on or when the _STATS
-environment variable is set.
+Returns 1 when L<< stats collection|/"-Stats" >> is enabled.
Note that this is a static method, not an accessor and should be overridden
by declaring C in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
@@ -2907,6 +2943,12 @@ to be shown in hit debug tables in the test server.
=item *
+C - Controlls if the C or C environment
+variable should be used for determining the request path. See L
+for more information.
+
+=item *
+
C - See L.
=back
@@ -3136,6 +3178,8 @@ random: Roland Lammel
Robert Sedlacek C<< >>
+SpiceMan: Marcel Montes
+
sky: Arthur Bergman
szbalint: Balint Szilakszi
@@ -3150,8 +3194,12 @@ Will Hawes C
willert: Sebastian Willert
+wreis: Wallace Reis
+
Yuval Kogman, C
+rainboxx: Matthias Dietrich, C
+
=head1 LICENSE
This library is free software. You can redistribute it and/or modify it under
diff --git a/lib/Catalyst/Component.pm b/lib/Catalyst/Component.pm
index 1b2d462..28da155 100644
--- a/lib/Catalyst/Component.pm
+++ b/lib/Catalyst/Component.pm
@@ -170,7 +170,7 @@ to be stored in the application's component hash.
C<< my $component_instance = $component->COMPONENT($app, $arguments); >>
-If this method is present (as it is on all Catalyst::Component subclasses,
+If this method is present (as it is on all Catalyst::Component subclasses),
it is called by Catalyst during setup_components with the application class
as $app and any config entry on the application for this component (for example,
in the case of MyApp::Controller::Foo this would be
@@ -185,7 +185,7 @@ something like this:
sub COMPONENT {
my ($class, $app, $args) = @_;
- $args = $self->merge_config_hashes($self->config, $args);
+ $args = $class->merge_config_hashes($class->config, $args);
return $class->new($app, $args);
}
@@ -200,6 +200,12 @@ key value pair, or you can specify a hashref. In either case the keys
will be merged with any existing config settings. Each component in
a Catalyst application has its own config hash.
+The component's config hash is merged with any config entry on the
+application for this component and passed to C (as mentioned
+above at L). The common practice to access the merged
+config is to use a Moose attribute for each config entry on the
+receiving component.
+
=head2 $c->process()
This is the default method called on a Catalyst component in the dispatcher.
diff --git a/lib/Catalyst/Controller.pm b/lib/Catalyst/Controller.pm
index 9f52b3f..b1c4c94 100644
--- a/lib/Catalyst/Controller.pm
+++ b/lib/Catalyst/Controller.pm
@@ -225,7 +225,9 @@ sub register_action_methods {
foreach my $method (@methods) {
my $name = $method->name;
- my $attributes = $method->attributes;
+ # Horrible hack! All method metaclasses should have an attributes
+ # method, core Moose bug - see r13354.
+ my $attributes = $method->can('attributes') ? $method->attributes : [];
my $attrs = $self->_parse_attrs( $c, $name, @{ $attributes } );
if ( $attrs->{Private} && ( keys %$attrs > 1 ) ) {
$c->log->debug( 'Bad action definition "'
@@ -248,16 +250,25 @@ sub register_action_methods {
}
}
-sub create_action {
+sub action_class {
my $self = shift;
my %args = @_;
my $class = (exists $args{attributes}{ActionClass}
- ? $args{attributes}{ActionClass}[0]
- : $self->_action_class);
+ ? $args{attributes}{ActionClass}[0]
+ : $self->_action_class);
+
Class::MOP::load_class($class);
+ return $class;
+}
+sub create_action {
+ my $self = shift;
+ my %args = @_;
+
+ my $class = $self->action_class(%args);
my $action_args = $self->config->{action_args};
+
my %extra_args = (
%{ $action_args->{'*'} || {} },
%{ $action_args->{ $args{name} } || {} },
@@ -446,11 +457,31 @@ of setting namespace to '' (the null string).
Sets 'path_prefix', as described below.
+=head2 action
+
+Allows you to set the attributes that the dispatcher creates actions out of.
+This allows you to do 'rails style routes', or override some of the
+attribute defintions of actions composed from Roles.
+You can set arguments globally (for all actions of the controller) and
+specifically (for a single action).
+
+ __PACKAGE__->config(
+ action => {
+ '*' => { Chained => 'base', Args => 0 },
+ base => { Chained => '/', PathPart => '', CaptureArgs => 0 },
+ },
+ );
+
+In the case above every sub in the package would be made into a Chain
+endpoint with a URI the same as the sub name for each sub, chained
+to the sub named C. Ergo dispatch to C would call the
+C method, then the C method.
+
=head2 action_args
Allows you to set constructor arguments on your actions. You can set arguments
-globally (for all actions of the controller) and specifically (for a single
-action). This is particularly useful when using Cs
+globally and specifically (as above).
+This is particularly useful when using Cs
(L) and custom Ces.
__PACKAGE__->config(
@@ -509,6 +540,11 @@ action methods for this package.
Creates action objects for a set of action methods using C< create_action >,
and registers them with the dispatcher.
+=head2 $self->action_class(%args)
+
+Used when a controller is creating an action to determine the correct base
+action class to use.
+
=head2 $self->create_action(%args)
Called with a hash of data to be use for construction of a new
diff --git a/lib/Catalyst/DispatchType/Regex.pm b/lib/Catalyst/DispatchType/Regex.pm
index 0d6da04..4b1beae 100644
--- a/lib/Catalyst/DispatchType/Regex.pm
+++ b/lib/Catalyst/DispatchType/Regex.pm
@@ -151,6 +151,7 @@ sub uri_for_action {
my $re = "$orig";
$re =~ s/^\^//;
$re =~ s/\$$//;
+ $re =~ s/\\([^\\])/$1/g;
my $final = '/';
my @captures = @$captures;
while (my ($front, $rest) = split(/\(/, $re, 2)) {
diff --git a/lib/Catalyst/Engine.pm b/lib/Catalyst/Engine.pm
index 7ba4167..e770f32 100644
--- a/lib/Catalyst/Engine.pm
+++ b/lib/Catalyst/Engine.pm
@@ -10,6 +10,8 @@ use HTML::Entities;
use HTTP::Body;
use HTTP::Headers;
use URI::QueryParam;
+use Encode ();
+use utf8;
use namespace::clean -except => 'meta';
@@ -131,6 +133,14 @@ sub finalize_error {
$c->res->content_type('text/html; charset=utf-8');
my $name = ref($c)->config->{name} || join(' ', split('::', ref $c));
+
+ # Prevent Catalyst::Plugin::Unicode::Encoding from running.
+ # This is a little nasty, but it's the best way to be clean whether or
+ # not the user has an encoding plugin.
+
+ if ($c->can('encoding')) {
+ $c->{encoding} = '';
+ }
my ( $title, $error, $infos );
if ( $c->debug ) {
@@ -279,11 +289,12 @@ sub finalize_error {