( 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);
$_ = "$_";
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);
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}) {
use Test::More;
-plan tests => 30;
+plan tests => 33;
use_ok('TestApp');
"/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
#
"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");
'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} ),