From: Tomas Doran Date: Tue, 12 May 2009 17:26:59 +0000 (+0000) Subject: Add a few more tests for this issue in various other positions and dispatch types... X-Git-Tag: 5.80004~28 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=6ab73369947422004890abb05035c491b086283f Add a few more tests for this issue in various other positions and dispatch types, and fix them all --- diff --git a/Changes b/Changes index 58edea3..349fc63 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,8 @@ (Phil Mitchell) - Add 'use Catalyst' to documentation for a Moose MyApp class as noted by dmaki. (t0m) + - Fix so that / (and other special characters) are URL encoded when + passed into $c->uri_for as Args/CaptureArgs (t0m) 5.80003 2009-04-29 16:23:53 - Various POD tweaks. (hdp, dandv) diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index bab0bd4..edd217e 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -1188,7 +1188,7 @@ sub uri_for { ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} ); carp "uri_for called with undef argument" if grep { ! defined $_ } @args; - s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args; + s/([^A-Za-z0-9\-_.!~*'()])/$URI::Escape::escapes{$1}/go for @args; unshift(@args, $path); @@ -1222,7 +1222,7 @@ sub uri_for { $_ = "$_"; utf8::encode( $_ ) if utf8::is_utf8($_); # using the URI::Escape pattern here so utf8 chars survive - s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go; + s/([^A-Za-z0-9\-_.!~*'()])/$URI::Escape::escapes{$1}/go; s/ /+/g; "${key}=$_"; } ( ref $val eq 'ARRAY' ? @$val : $val )); } @keys); diff --git a/lib/Catalyst/DispatchType/Chained.pm b/lib/Catalyst/DispatchType/Chained.pm index b0e3f53..8600ac0 100644 --- a/lib/Catalyst/DispatchType/Chained.pm +++ b/lib/Catalyst/DispatchType/Chained.pm @@ -329,7 +329,9 @@ sub uri_for_action { if (my $cap = $curr->attributes->{CaptureArgs}) { return undef unless @captures >= $cap->[0]; # not enough captures if ($cap->[0]) { - unshift(@parts, splice(@captures, -$cap->[0])); + unshift(@parts, + map { s/([^A-Za-z0-9\-_.!~*'()])/$URI::Escape::escapes{$1}/go; $_; } + splice(@captures, -$cap->[0])); } } if (my $pp = $curr->attributes->{PartPath}) { diff --git a/lib/Catalyst/DispatchType/Regex.pm b/lib/Catalyst/DispatchType/Regex.pm index 1c0c59e..354fe33 100644 --- a/lib/Catalyst/DispatchType/Regex.pm +++ b/lib/Catalyst/DispatchType/Regex.pm @@ -148,7 +148,7 @@ sub uri_for_action { $re =~ s/^\^//; $re =~ s/\$$//; my $final = '/'; - my @captures = @$captures; + my @captures = map { s/([^A-Za-z0-9\-_.!~*'()])/$URI::Escape::escapes{$1}/go; $_; } @$captures; while (my ($front, $rest) = split(/\(/, $re, 2)) { last unless defined $rest; ($rest, $re) = diff --git a/t/aggregate/unit_core_uri_for_action.t b/t/aggregate/unit_core_uri_for_action.t index dfe3666..53d71df 100644 --- a/t/aggregate/unit_core_uri_for_action.t +++ b/t/aggregate/unit_core_uri_for_action.t @@ -8,7 +8,7 @@ use lib "$FindBin::Bin/../lib"; use Test::More; -plan tests => 30; +plan tests => 33; use_ok('TestApp'); @@ -54,6 +54,10 @@ is($dispatcher->uri_for_action($regex_action, [ 'foo', 123 ]), "/action/regexp/foo/123", "Regex action interpolates captures correctly"); +is($dispatcher->uri_for_action($regex_action, [ 'foo/bar', 123 ]), + "/action/regexp/foo%2Fbar/123", + "Regex action interpolates captures correctly and url encodes /"); + # # Index Action # @@ -105,6 +109,10 @@ is($context->uri_for($path_action, qw/one two/, { q => 1 }), "http://127.0.0.1/foo/action/relative/relative/one/two?q=1", "uri_for correct for path action with args and query"); +is($context->uri_for($path_action, qw|one/quux two|), + "http://127.0.0.1/foo/action/relative/relative/one%2Fquux/two", + "uri_for correctly url encoded for path action with args containing /"); + ok(!defined($context->uri_for($path_action, [ 'blah' ])), "no URI returned by uri_for for Path action with snippets"); @@ -161,8 +169,12 @@ is($context->uri_for($chained_action, [ 1 ], 2, { q => 1 }), 'uri_for_action returns uri with empty arg on undef last argument' ); is( $context->uri_for_action($action_needs_two, [ 'foo' , 'bar/baz' ], (3,4)), - 'http://127.0.0.1/foo/chained/foo2/foo/bar%2Fbaz/end2/3/', - 'uri_for_action returns uri with empty arg on undef last argument' ); + 'http://127.0.0.1/foo/chained/foo2/foo/bar%2Fbaz/end2/3/4', + 'uri_for_action works correctly when CaptureArg contains /' ); + + is( $context->uri_for_action($action_needs_two, [ 'foo' , 'bar' ], ('3/baz',4)), + 'http://127.0.0.1/foo/chained/foo2/foo/bar/end2/3%2Fbaz/4', + 'uri_for_action works correctly when Args contains /' ); my $complex_chained = '/action/chained/empty_chain_f'; is( $context->uri_for_action( $complex_chained, [23], (13), {q => 3} ),