X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst.pm;h=8c598ba5e7688bf7b131d6c43ca98c8af154fe69;hb=cea573d8055680f12b061aa8adcf0b54f576bb7b;hp=24674b95c50002ed73785f8f79fe98ab7d7d17b9;hpb=103f2d968b5a1a732c19c39ae03cdd9a44a96a4b;p=catagits%2FCatalyst-Runtime.git
diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm
index 24674b9..8c598ba 100644
--- a/lib/Catalyst.pm
+++ b/lib/Catalyst.pm
@@ -27,7 +27,6 @@ use HTML::Entities;
use Tree::Simple qw/use_weak_refs/;
use Tree::Simple::Visitor::FindByUID;
use Class::C3::Adopt::NEXT;
-use List::MoreUtils qw/uniq/;
use attributes;
use String::RewritePrefix;
use Catalyst::EngineLoader;
@@ -51,6 +50,7 @@ use Catalyst::Middleware::Stash;
use Plack::Util;
use Class::Load 'load_class';
use Encode 2.21 'decode_utf8', 'encode_utf8';
+use Scalar::Util;
BEGIN { require 5.008003; }
@@ -204,7 +204,7 @@ sub composed_stats_class {
__PACKAGE__->_encode_check(Encode::FB_CROAK | Encode::LEAVE_SRC);
# Remember to update this in Catalyst::Runtime as well!
-our $VERSION = '5.90106';
+our $VERSION = '5.90115';
$VERSION = eval $VERSION if $VERSION =~ /_/; # numify for warning-free dev releases
sub import {
@@ -246,11 +246,6 @@ sub _application { $_[0] }
Catalyst - The Elegant MVC Web Application Framework
-=for html
-
-
-
=head1 SYNOPSIS
See the L distribution for comprehensive
@@ -474,7 +469,7 @@ or stash it like so:
and access it from the stash.
-Keep in mind that the C method used is that of the caller action. So a C<$c-Edetach> inside a forwarded action would run the C method from the original action requested.
+Keep in mind that the C method used is that of the caller action. So a C<< $c->detach >> inside a forwarded action would run the C method from the original action requested.
=cut
@@ -1705,23 +1700,20 @@ sub uri_for {
# somewhat lifted from URI::_query's query_form
$query = '?'.join('&', map {
my $val = $params->{$_};
- #s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go; ## Commented out because seems to lead to double encoding - JNAP
- s/ /+/g;
- my $key = $_;
+ my $key = encode_utf8($_);
+ # using the URI::Escape pattern here so utf8 chars survive
+ $key =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
+ $key =~ s/ /+/g;
+
$val = '' unless defined $val;
(map {
- my $param = "$_";
- $param = encode_utf8($param);
+ my $param = encode_utf8($_);
# using the URI::Escape pattern here so utf8 chars survive
$param =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
$param =~ s/ /+/g;
- $key = encode_utf8($key);
- # using the URI::Escape pattern here so utf8 chars survive
- $key =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
- $key =~ s/ /+/g;
-
- "${key}=$param"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
+ "${key}=$param";
+ } ( ref $val eq 'ARRAY' ? @$val : $val ));
} @keys);
}
@@ -2321,6 +2313,10 @@ sub finalize_encoding {
(defined($res->body)) and
(ref(\$res->body) eq 'SCALAR')
) {
+ # if you are finding yourself here and your body is already encoded correctly
+ # and you want to turn this off, use $c->clear_encoding to prevent encoding
+ # at this step, or set encoding to undef in the config to do so for the whole
+ # application. See the ENCODING documentaiton for better notes.
$c->res->body( $c->encoding->encode( $c->res->body, $c->_encode_check ) );
# Set the charset if necessary. This might be a bit bonkers since encodable response
@@ -2490,6 +2486,8 @@ sub prepare {
};
$c->log_request;
+ $c->{stash} = $c->stash;
+ Scalar::Util::weaken($c->{stash});
return $c;
}
@@ -2738,9 +2736,16 @@ sub log_request_parameters {
next if ! keys %$params;
my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] );
for my $key ( sort keys %$params ) {
- my $param = $params->{$key};
- my $value = defined($param) ? $param : '';
- $t->row( $key, ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
+ my @values = ();
+ if(ref $params eq 'Hash::MultiValue') {
+ @values = $params->get_all($key);
+ } else {
+ my $param = $params->{$key};
+ if( defined($param) ) {
+ @values = ref $param eq 'ARRAY' ? @$param : $param;
+ }
+ }
+ $t->row( $key.( scalar @values > 1 ? ' [multiple]' : ''), join(', ', @values) );
}
$c->log->debug( ucfirst($type) . " Parameters are:\n" . $t->draw );
}
@@ -3571,18 +3576,23 @@ sub setup_encoding {
=head2 handle_unicode_encoding_exception
-Hook to let you customize how encoding errors are handled. By default
-we just throw an exception. Receives a hashref of debug information.
-Example of call:
+Hook to let you customize how encoding errors are handled. By default
+we just throw an exception and the default error page will pick it up.
+Receives a hashref of debug information. Example of call (from the
+Catalyst internals):
- $c->handle_unicode_encoding_exception({
+ my $decoded_after_fail = $c->handle_unicode_encoding_exception({
param_value => $value,
error_msg => $_,
encoding_step => 'params',
- });
+ });
-You can override this for custom handling of unicode errors. If you want a
-custom response here, one approach is to throw an HTTP style exception:
+The calling code expects to receive a decoded string or an exception.
+
+You can override this for custom handling of unicode errors. By
+default we just die. If you want a custom response here, one approach
+is to throw an HTTP style exception, instead of returning a decoded
+string or throwing a generic exception.
sub handle_unicode_encoding_exception {
my ($c, $params) = @_;
@@ -3595,9 +3605,16 @@ in your application:
sub handle_unicode_encoding_exception {
my ($c, $params) = @_;
$c->stash(BAD_UNICODE_DATA=>$params);
+ # return a dummy string.
return 1;
}
+NOTE: Please keep in mind that once an error like this occurs,
+the request setup is still ongoing, which means the state of C<$c> and
+related context parts like the request and response may not be setup
+up correctly (since we haven't finished the setup yet). If you throw
+an exception the setup is aborted.
+
=cut
sub handle_unicode_encoding_exception {
@@ -3642,12 +3659,15 @@ sub _handle_param_unicode_decoding {
return $value if blessed($value); #don't decode when the value is an object.
my $enc = $self->encoding;
+
+ return $value unless $enc; # don't decode if no encoding is specified
+
$check ||= $self->_encode_check;
return try {
$enc->decode( $value, $check);
}
catch {
- $self->handle_unicode_encoding_exception({
+ return $self->handle_unicode_encoding_exception({
param_value => $value,
error_msg => $_,
encoding_step => 'params',
@@ -4282,18 +4302,20 @@ value to undef.
C
-When there is an error in an action chain, the default behavior is to continue
-processing the remaining actions and then catch the error upon chain end. This
-can lead to running actions when the application is in an unexpected state. If
-you have this issue, setting this config value to true will promptly exit a
-chain when there is an error raised in any action (thus terminating the chain
-early.)
+Defaults to true.
-use like:
+When there is an error in an action chain, the default behavior is to
+abort the processing of the remaining actions to avoid running them
+when the application is in an unexpected state.
- __PACKAGE__->config(abort_chain_on_error_fix => 1);
+Before version 5.90070, the default used to be false. To keep the old
+behaviour, you can explicitly set the value to false. E.g.
+
+ __PACKAGE__->config(abort_chain_on_error_fix => 0);
+
+If this setting is set to false, then the remaining actions are
+performed and the error is caught at the end of the chain.
-In the future this might become the default behavior.
=item *
@@ -4747,6 +4769,11 @@ the encoding configuration to undef.
This is recommended for temporary backwards compatibility only.
+To turn it off for a single request use the L
+method to turn off encoding for this request. This can be useful
+when you are setting the body to be an arbitrary block of bytes,
+especially if that block happens to be a block of UTF8 text.
+
Encoding is automatically applied when the content-type is set to
a type that can be encoded. Currently we encode when the content type
matches the following regular expression:
@@ -4869,7 +4896,7 @@ andrewalker: André Walker
Andrew Bramble
-Andrew Ford EA.Ford@ford-mason.co.ukE
+Andrew Ford
Andrew Ruthven
@@ -4883,19 +4910,19 @@ Caelum: Rafael Kitover
chansen: Christian Hansen
-Chase Venters C
+Chase Venters
chicks: Christopher Hicks
-Chisel Wright C
+Chisel Wright
-Danijel Milicevic C
+Danijel Milicevic
davewood: David Schmidt
-David Kamholz Edkamholz@cpan.orgE
+David Kamholz
-David Naughton, C
+David Naughton
David E. Wheeler
@@ -4917,7 +4944,7 @@ gabb: Danijel Milicevic
Gary Ashton Jones
-Gavin Henry C
+Gavin Henry
Geoff Richards
@@ -4929,7 +4956,7 @@ ilmari: Dagfinn Ilmari Mannsåker
jcamacho: Juan Camacho
-jester: Jesse Sheidlower C
+jester: Jesse Sheidlower
jhannah: Jay Hannah
@@ -4939,9 +4966,9 @@ Johan Lindstrom
jon: Jon Schutz
-Jonathan Rockway C<< >>
+Jonathan Rockway
-Kieren Diment C
+Kieren Diment
konobi: Scott McWhirter
@@ -4977,7 +5004,9 @@ rafl: Florian Ragwitz
random: Roland Lammel
-Robert Sedlacek C<< >>
+revmischa: Mischa Spiegelmock
+
+Robert Sedlacek
SpiceMan: Marcel Montes
@@ -4991,17 +5020,17 @@ Ulf Edvinsson
vanstyn: Henry Van Styn
-Viljo Marrandi C
+Viljo Marrandi
-Will Hawes C
+Will Hawes
willert: Sebastian Willert
wreis: Wallace Reis
-Yuval Kogman, C
+Yuval Kogman
-rainboxx: Matthias Dietrich, C
+rainboxx: Matthias Dietrich
dd070: Dhaval Dhanani