Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Catalyst: Users

uri_for() doesn't encode to utf8 first argument

 

 

Catalyst users RSS feed   Index | Next | Previous | View Threaded


dreel at bk

Apr 22, 2008, 8:30 AM

Post #1 of 17 (720 views)
Permalink
uri_for() doesn't encode to utf8 first argument

Version Catalyst 5.7012
For example, I want to use as first arg the string: uri_for('/controller/*some_param1*','arg1','arg2')
If *some_param1* contains non-ascii symbols it must be encoded as URI::Escape, but it missed.

I've tested it with Russian symbols:
$c->uri_for('/network/') returns string http://localhost:3000/network/' wrong! not-encoded!;
$c->uri_for('/network','') returns string http://localhost:3000/network/%CC%D1%CA right.

So what we get if uri wasn't encoded? Browser incompatibility! IE by default encode all URIs with UTF-8,
but FF using system charset (win-1251 for me). Most of URIs become broken.

I've found out the way to correct it. In Catalyst.pm
The block where we encode @args for uri_for:
945: my $params =
946: ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );

948: carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
unshift(@args, $path); # !!!add UNencoded $path!!!

Sorry, can't sync with svn, so plain text used (
My correction:
945: my $params =
( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );

+ $path =~ s!/+!/!g; # strip extra slashes '///'
+ my @path_args = split('/', $path);
+ unshift(@args, @path_args);
carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
- unshift(@args, $path);

It this case all data will be encoded.

Any suggestions?
--
dr.eel


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dbix-class at trout

Apr 22, 2008, 10:01 AM

Post #2 of 17 (705 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

On Tue, Apr 22, 2008 at 07:30:51PM +0400, dreel wrote:
>
> Version Catalyst 5.7012
> For example, I want to use as first arg the string: uri_for('/controller/*some_param1*','arg1','arg2')
> If *some_param1* contains non-ascii symbols it must be encoded as URI::Escape, but it missed.
>
> I've tested it with Russian symbols:
> $c->uri_for('/network/МСК') returns string http://localhost:3000/network/МСК' wrong! not-encoded!;
> $c->uri_for('/network','МСК') returns string http://localhost:3000/network/%CC%D1%CA right.
>
> So what we get if uri wasn't encoded? Browser incompatibility! IE by default encode all URIs with UTF-8,
> but FF using system charset (win-1251 for me). Most of URIs become broken.
>
> I've found out the way to correct it. In Catalyst.pm
> The block where we encode @args for uri_for:
> 945: my $params =
> 946: ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
>
> 948: carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
> s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
> unshift(@args, $path); # !!!add UNencoded $path!!!
>
> Sorry, can't sync with svn, so plain text used (
> My correction:
> 945: my $params =
> ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
>
> + $path =~ s!/+!/!g; # strip extra slashes '///'
> + my @path_args = split('/', $path);
> + unshift(@args, @path_args);
> carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
> s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
> - unshift(@args, $path);
>
> It this case all data will be encoded.
>
> Any suggestions?

$c->uri_for($c->controller('Network')->action_for('root'), 'some_param1', 'arg1', 'arg2');

is a better approach to this and will encode correctly.

Your patch looks like it -might- work, but you don't seem to have provided
an addition to the test suite so we can't apply it.

--
Matt S Trout Need help with your Catalyst or DBIx::Class project?
Technical Director http://www.shadowcat.co.uk/catalyst/
Shadowcat Systems Ltd. Want a managed development or deployment platform?
http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/servers/

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dbix-class at trout

May 3, 2008, 3:24 PM

Post #3 of 17 (619 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

If you're going to resubmit a patch, please do so as a diff -ur or
'svn diff' or 'svk diff' to the list, and send it as plain text rather
than application/octet-stream.

--
Matt S Trout Need help with your Catalyst or DBIx::Class project?
Technical Director http://www.shadowcat.co.uk/catalyst/
Shadowcat Systems Ltd. Want a managed development or deployment platform?
http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/servers/

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

May 6, 2008, 9:49 AM

Post #4 of 17 (606 views)
Permalink
Re[2]: uri_for() doesn't encode to utf8 first argument [In reply to]

The -diff

Index: Catalyst.pm
===================================================================
--- Catalyst.pm (revision 7629)
+++ Catalyst.pm (working copy)
@@ -54,7 +54,7 @@

__PACKAGE__->mk_classdata($_)
for qw/components arguments dispatcher engine log dispatcher_class
- engine_class context_class request_class response_class stats_class
+ engine_class context_class request_class response_class stats_class
setup_finished/;

__PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
@@ -112,30 +112,30 @@

### in lib/MyApp.pm
use Catalyst qw/-Debug/; # include plugins here as well
-
+
### In lib/MyApp/Controller/Root.pm (autocreated)
sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc.
my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
$c->stash->{template} = 'foo.tt'; # set the template
# lookup something from db -- stash vars are passed to TT
- $c->stash->{data} =
+ $c->stash->{data} =
$c->model('Database::Foo')->search( { country => $args[0] } );
if ( $c->req->params->{bar} ) { # access GET or POST parameters
$c->forward( 'bar' ); # process another action
- # do something else after forward returns
+ # do something else after forward returns
}
}
-
+
# The foo.tt TT template can use the stash data from the database
[% WHILE (item = data.next) %]
[% item.foo %]
[% END %]
-
+
# called for /bar/of/soap, /bar/of/soap/10, etc.
sub bar : Path('/bar/of/soap') { ... }

# called for all actions, from the top-most controller downwards
- sub auto : Private {
+ sub auto : Private {
my ( $self, $c ) = @_;
if ( !$c->user_exists ) { # Catalyst::Plugin::Authentication
$c->res->redirect( '/login' ); # require login
@@ -143,9 +143,9 @@
}
return 1; # success; carry on to next action
}
-
+
# called after all actions are finished
- sub end : Private {
+ sub end : Private {
my ( $self, $c ) = @_;
if ( scalar @{ $c->error } ) { ... } # handle errors
return if $c->res->body; # already have a response
@@ -155,20 +155,20 @@
### in MyApp/Controller/Foo.pm
# called for /foo/bar
sub bar : Local { ... }
-
+
# called for /blargle
sub blargle : Global { ... }
-
+
# an index action matches /foo, but not /foo/1, etc.
sub index : Private { ... }
-
+
### in MyApp/Controller/Foo/Bar.pm
# called for /foo/bar/baz
sub baz : Local { ... }
-
+
# first Root auto is called, then Foo auto, then this
sub auto : Private { ... }
-
+
# powerful regular expression paths are also possible
sub details : Regex('^product/(\w+)/details$') {
my ( $self, $c ) = @_;
@@ -249,7 +249,7 @@
environment settings override the application, with <MYAPP>_STATS having the
highest priority.

-e.g.
+e.g.

use Catalyst qw/-Stats=1/

@@ -320,8 +320,8 @@

=head2 $c->detach()

-The same as C<forward>, but doesn't return to the previous action when
-processing is finished.
+The same as C<forward>, but doesn't return to the previous action when
+processing is finished.

When called with no arguments it escapes the processing chain entirely.

@@ -348,7 +348,7 @@
$c->stash->{foo} = $bar;
$c->stash( { moose => 'majestic', qux => 0 } );
$c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
-
+
# stash is automatically passed to the view for use in a template
$c->forward( 'MyApp::View::TT' );

@@ -456,7 +456,7 @@
return $comp;
}

-# Find possible names for a prefix
+# Find possible names for a prefix

sub _comp_names {
my ( $c, @prefixes ) = @_;
@@ -528,7 +528,7 @@

Any extra arguments are directly passed to ACCEPT_CONTEXT.

-If the name is omitted, it will look for
+If the name is omitted, it will look for
- a model object in $c->stash{current_model_instance}, then
- a model name in $c->stash->{current_model}, then
- a config setting 'default_model', or
@@ -542,7 +542,7 @@
@args )
if $name;
if (ref $c) {
- return $c->stash->{current_model_instance}
+ return $c->stash->{current_model_instance}
if $c->stash->{current_model_instance};
return $c->model( $c->stash->{current_model} )
if $c->stash->{current_model};
@@ -573,7 +573,7 @@

Any extra arguments are directly passed to ACCEPT_CONTEXT.

-If the name is omitted, it will look for
+If the name is omitted, it will look for
- a view object in $c->stash{current_view_instance}, then
- a view name in $c->stash->{current_view}, then
- a config setting 'default_view', or
@@ -587,7 +587,7 @@
@args )
if $name;
if (ref $c) {
- return $c->stash->{current_view_instance}
+ return $c->stash->{current_view_instance}
if $c->stash->{current_view_instance};
return $c->view( $c->stash->{current_view} )
if $c->stash->{current_view};
@@ -851,7 +851,7 @@

EOF
}
-
+
if ( $class->debug ) {
my @plugins = map { "$_ " . ( $_->VERSION || '' ) } $class->registered_plugins;

@@ -948,11 +948,11 @@
my $params =
( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );

+ $path =~ s!/+!/!g; # strip extra slashes '///'
+ unshift(@args, split('/', $path));
carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;

- unshift(@args, $path);
-
unless (defined $path && $path =~ s!^/!!) { # in-place strip
my $namespace = $c->namespace;
if (defined $path) { # cheesy hack to handle path '../foo'
@@ -960,7 +960,7 @@
}
unshift(@args, $namespace || '');
}
-
+
# join args with '/', or a blank string
my $args = join('/', grep { defined($_) } @args);
$args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
@@ -1131,7 +1131,7 @@
</li>
</ul>
<h2>In conclusion</h2>
- <p>The Catalyst team hopes you will enjoy using Catalyst as much
+ <p>The Catalyst team hopes you will enjoy using Catalyst as much
as we enjoyed making it. Please contact us if you have ideas
for improvement or other feedback.</p>
</div>
@@ -1183,8 +1183,8 @@

sub dump_these {
my $c = shift;
- [ Request => $c->req ],
- [ Response => $c->res ],
+ [ Request => $c->req ],
+ [ Response => $c->res ],
[ Stash => $c->stash ],
[ Config => $c->config ];
}
@@ -1218,11 +1218,11 @@
my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;

push( @{ $c->stack }, $code );
-
+
eval { $c->state( &$code( $class, $c, @{ $c->req->args } ) || 0 ) };

$c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
-
+
my $last = pop( @{ $c->stack } );

if ( my $error = $@ ) {
@@ -1277,7 +1277,7 @@
# forward, locate the caller
if ( my $parent = $c->stack->[-1] ) {
$c->stats->profile(
- begin => $action,
+ begin => $action,
parent => "$parent" . $c->counter->{"$parent"},
uid => $uid,
);
@@ -1292,7 +1292,7 @@
}
}
else {
-
+
# root-level call
$c->stats->profile(
begin => $action,
@@ -1317,7 +1317,7 @@

my $request = delete $localized->{request} || {};
my $response = delete $localized->{response} || {};
-
+
local @{ $c }{ keys %$localized } = values %$localized;
local @{ $c->request }{ keys %$request } = values %$request;
local @{ $c->response }{ keys %$response } = values %$response;
@@ -1360,12 +1360,12 @@

$c->finalize_body;
}
-
- if ($c->use_stats) {
+
+ if ($c->use_stats) {
my $elapsed = sprintf '%f', $c->stats->elapsed;
my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
$c->log->info(
- "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );
+ "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );
}

return $c->response->status;
@@ -1411,7 +1411,7 @@
if ( my $location = $c->response->redirect ) {
$c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
$c->response->header( Location => $location );
-
+
if ( !$c->response->body ) {
# Add a default body if none is already present
$c->response->body(
@@ -1512,7 +1512,7 @@

my $c = $class->prepare(@arguments);
$c->dispatch;
- $status = $c->finalize;
+ $status = $c->finalize;
};

if ( my $error = $@ ) {
@@ -1568,7 +1568,7 @@

$c->stats($class->stats_class->new)->enable($c->use_stats);
if ( $c->debug ) {
- $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
+ $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
}

# For on-demand data
@@ -1592,7 +1592,7 @@
# Prepare the body for reading, either by prepare_body
# or the user, if they are using $c->read
$c->prepare_read;
-
+
# Parse the body unless the user wants it on-demand
unless ( $c->config->{parse_on_demand} ) {
$c->prepare_body;
@@ -1859,9 +1859,9 @@
my @paths = qw( ::Controller ::C ::Model ::M ::View ::V );
my $config = $class->config->{ setup_components };
my $extra = delete $config->{ search_extra } || [];
-
+
push @paths, @$extra;
-
+
my $locator = Module::Pluggable::Object->new(
search_path => [ map { s/^(?=::)/$class/; $_; } @paths ],
%$config
@@ -1869,7 +1869,7 @@

my @comps = sort { length $a <=> length $b } $locator->plugins;
my %comps = map { $_ => 1 } @comps;
-
+
for my $component ( @comps ) {

# We pass ignore_loaded here so that overlay files for (e.g.)
@@ -1883,11 +1883,11 @@
$component => $module,
map {
$_ => $class->setup_component( $_ )
- } grep {
+ } grep {
not exists $comps{$_}
} Devel::InnerPackage::list_packages( $component )
);
-
+
for my $key ( keys %modules ) {
$class->components->{ $key } = $modules{ $key };
}
@@ -2144,7 +2144,7 @@
}


-=head2 $c->registered_plugins
+=head2 $c->registered_plugins

Returns a sorted list of the plugins which have either been stated in the
import list or which have been added via C<< MyApp->plugin(@args); >>.
@@ -2276,7 +2276,7 @@
parsing with a config parameter.

MyApp->config->{parse_on_demand} = 1;
-
+
=head1 PROXY SUPPORT

Many production servers operate using the common double-server approach,
@@ -2290,9 +2290,9 @@
the frontend and backend servers on the same machine. The following
changes are made to the request.

- $c->req->address is set to the user's real IP address, as read from
+ $c->req->address is set to the user's real IP address, as read from
the HTTP X-Forwarded-For header.
-
+
The host value for $c->req->base and $c->req->uri is set to the real
host, as read from the HTTP X-Forwarded-Host header.

@@ -2304,7 +2304,7 @@
headers.

MyApp->config->{using_frontend_proxy} = 1;
-
+
If you do not wish to use the proxy support at all, you may set:

MyApp->config->{ignore_frontend_proxy} = 1;
X-AntiVirus: checked by AntiVir MailGuard (Version: 8.0.0.18; AVE: 8.1.0.37; VDF: 7.0.3.243)



Test (file encoding UTF-8):
#############################################
# unit_core_uri_for_first_arg.t
use strict;
use warnings;

use Test::More 'no_plan';
use URI;

use_ok('Catalyst');

my $request = Catalyst::Request->new( {
base => URI->new('http://127.0.0.1/foo')
} );

my $context = Catalyst->new( {
request => $request,
namespace => 'yada',
} );

# test encode first argument with utf-8,

$request->base( URI->new('http://127.0.0.1/') );

$context->namespace('');

is( Catalyst::uri_for( $context, '/animal/', '', { param1 => "" })->as_string,
'http://127.0.0.1/animal/%D1%91%D0%B6/%D1%87%D1%91%D1%82?param1=%C3%91%C2%89%C3%91%C2%83%C3%90%C2%BF',
'URI for undef action with first param as string in unicode'
);


--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


jon at jrock

May 6, 2008, 10:00 AM

Post #5 of 17 (607 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

* On Tue, May 06 2008, Dmitriy S. Sinyavskiy wrote:
> The -diff
>
> Index: Catalyst.pm
> ===================================================================

Please regenerate this diff without the whitespace changes. It is
completely unreadable in the current form.

Examples:

> - engine_class context_class request_class response_class stats_class
> + engine_class context_class request_class response_class stats_class

> -
> +

> - $c->stash->{data} =
> + $c->stash->{data} =

These spurious changes fuck up the history (when we apply the patch),
and they make it extremely difficult to review your changes.

GNU diff accepts an "--ignore-space-change" option that should remove
these extra changes.

Regards,
Jonathan Rockway

--
print just => another => perl => hacker => if $,=$"

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

May 15, 2008, 7:50 AM

Post #6 of 17 (534 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

So what about my patch and test?
Is it right or someone can correct it?
The silence is here for a week or more (

--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


jshirley at gmail

May 15, 2008, 5:27 PM

Post #7 of 17 (533 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

On Thu, May 15, 2008 at 11:50 PM, Dmitriy S. Sinyavskiy <dreel[at]bk.ru> wrote:
> So what about my patch and test?
> Is it right or someone can correct it?
> The silence is here for a week or more (
>


Jonathan Rockway asked you to regenerate without whitespace changes.

Just waiting on that from you to properly review it.

-J

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

May 16, 2008, 2:21 PM

Post #8 of 17 (523 views)
Permalink
Re[2]: uri_for() doesn't encode to utf8 first argument [In reply to]

Hello, J..
You write 16 2008 ., 4:27:07:

JS> On Thu, May 15, 2008 at 11:50 PM, Dmitriy S. Sinyavskiy <dreel[at]bk.ru> wrote:
>> So what about my patch and test?
>> Is it right or someone can correct it?
>> The silence is here for a week or more (
>>


JS> Jonathan Rockway asked you to regenerate without whitespace changes.

JS> Just waiting on that from you to properly review it.

JS> -J


It strange I haven't got received letter with this...may be deleted
by antispam (
Nevertheless I've done it now:

Index: Catalyst.pm
===================================================================
--- Catalyst.pm (revision 7759)
+++ Catalyst.pm (working copy)
@@ -948,10 +948,12 @@
my $params =
( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );

+ $path =~ s!/+!/!g; # strip extra slashes '///'
+ unshift(@args, split('/', $path));
carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;

- unshift(@args, $path);
+

unless (defined $path && $path =~ s!^/!!) { # in-place strip
my $namespace = $c->namespace;



--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


jon at jrock

May 16, 2008, 9:53 PM

Post #9 of 17 (519 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

* On Sat, May 17 2008, Dmitriy S. Sinyavskiy wrote:
> It strange I haven't got received letter with this...may be deleted
> by antispam (

Yes, your mailserver rejected my reply. However, the list did receive
it.

> Nevertheless I've done it now:
>
> Index: Catalyst.pm
> ===================================================================
> --- Catalyst.pm (revision 7759)
> +++ Catalyst.pm (working copy)
> @@ -948,10 +948,12 @@
> my $params =
> ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
>
> + $path =~ s!/+!/!g; # strip extra slashes '///'
> + unshift(@args, split('/', $path));
> carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
> s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
>
> - unshift(@args, $path);
> +
>
> unless (defined $path && $path =~ s!^/!!) { # in-place strip
> my $namespace = $c->namespace;

OK, but it looks like you forgot the tests. :) However, I think the
patch is sound. Please check that things like:

uri_for('/controller/ほげ')
*click that link*

dispatch correctly, though.

Regards,
Jonathan Rockway

--
print just => another => perl => hacker => if $,=$"

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

May 22, 2008, 10:05 AM

Post #10 of 17 (444 views)
Permalink
Re[3]: uri_for() doesn't encode to utf8 first argument [In reply to]

People? what about my patch? I heven't got received any response.
I'll be glad to now some news.
Thanks.

--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.




_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


chisel at herlpacker

May 22, 2008, 1:00 PM

Post #11 of 17 (446 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

On Thu, May 22, 2008 at 09:05:40PM +0400, Dmitriy S. Sinyavskiy wrote:
>
> People? what about my patch? I heven't got received any response.
> I'll be glad to now some news.
> Thanks.

Check the archives - you had a reply a few days ago - "patch looks ok,
but no tests" was the gist I think.


--
Chisel Wright
e: chisel[at]herlpacker.co.uk
w: http://www.herlpacker.co.uk/

Q: What's tiny and yellow and very, very, dangerous?
A: A canary with the super-user password.

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


jshirley at gmail

May 22, 2008, 1:18 PM

Post #12 of 17 (446 views)
Permalink
Re: Re[3]: uri_for() doesn't encode to utf8 first argument [In reply to]

On Thu, May 22, 2008 at 10:05 AM, Dmitriy S. Sinyavskiy <dreel[at]bk.ru> wrote:
>
> People? what about my patch? I heven't got received any response.
> I'll be glad to now some news.
> Thanks.
>

Your mailserver is rejecting mail. I suggest fixing your mail server
or viewing the list archives to make sure that you're not missing
things.

Thread: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/msg02771.html

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

May 23, 2008, 12:48 PM

Post #13 of 17 (431 views)
Permalink
Re[5]: uri_for() doesn't encode to utf8 first argument [In reply to]

Hello, J..
You write 23 мая 2008 г., 0:18:11:

JS> On Thu, May 22, 2008 at 10:05 AM, Dmitriy S. Sinyavskiy <dreel[at]bk.ru> wrote:
>>
>> People? what about my patch? I heven't got received any response.
>> I'll be glad to now some news.
>> Thanks.
>>

JS> Your mailserver is rejecting mail. I suggest fixing your mail server
JS> or viewing the list archives to make sure that you're not missing
JS> things.

JS> Thread:
JS> http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/msg02771.html


Test. Must be saved as UTF-8:
=================================
use strict;
use warnings;

use Test::More 'no_plan';
use URI;

use_ok('Catalyst');

my $request = Catalyst::Request->new( {
base => URI->new('http://127.0.0.1/foo')
} );

my $context = Catalyst->new( {
request => $request,
namespace => 'yada',
} );

# test encode first argument with utf-8,
{
$request->base( URI->new('http://127.0.0.1/') );

$context->namespace('');

is( Catalyst::uri_for( $context, '/animal/ёж', 'чёт', { param1 => "щуп" })->as_string,
'http://127.0.0.1/animal/%D1%91%D0%B6/%D1%87%D1%91%D1%82?param1=%C3%91%C2%89%C3%91%C2%83%C3%90%C2%BF',
'URI for undef action with first param as string in unicode'
);
}


--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

May 23, 2008, 4:53 PM

Post #14 of 17 (429 views)
Permalink
Re[6]: uri_for() doesn't encode to utf8 first argument [In reply to]

Hello, Dmitriy.
You write 23 мая 2008 г., 23:48:56:

DSS> Hello, J..
DSS> You write 23 мая 2008 г., 0:18:11:

JS>> On Thu, May 22, 2008 at 10:05 AM, Dmitriy S. Sinyavskiy <dreel[at]bk.ru> wrote:
>>>
>>> People? what about my patch? I heven't got received any response.
>>> I'll be glad to now some news.
>>> Thanks.
>>>

JS>> Your mailserver is rejecting mail. I suggest fixing your mail server
JS>> or viewing the list archives to make sure that you're not missing
JS>> things.

JS>> Thread:
JS>> http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/msg02771.html


DSS> Test. Must be saved as UTF-8:
DSS> =================================
DSS> use strict;
DSS> use warnings;

DSS> use Test::More 'no_plan';
DSS> use URI;

DSS> use_ok('Catalyst');

DSS> my $request = Catalyst::Request->new( {
base =>> URI->new('http://127.0.0.1/foo')
DSS> } );

DSS> my $context = Catalyst->new( {
request =>> $request,
namespace =>> 'yada',
DSS> } );

DSS> {
$request->>base( URI->new('http://127.0.0.1/') );

$context->>namespace('');

DSS> is( Catalyst::uri_for( $context, '/animal/ёж', 'чёт', { param1 => "щуп" })->as_string,
DSS> 'http://127.0.0.1/animal/%D1%91%D0%B6/%D1%87%D1%91%D1%82?param1=%C3%91%C2%89%C3%91%C2%83%C3%90%C2%BF',
DSS> 'URI for undef action with first param as string in unicode'
DSS> );
DSS> }

The previous test was wrong, sorry. I've found a mistake and correct
it. Test case including check for special chars <?>.

Tested today - it's working right with patch.

Test
=============

use strict;
use warnings;

use Test::More 'no_plan';
use URI;

use_ok('Catalyst');

my $request = Catalyst::Request->new( {
base => URI->new('http://127.0.0.1/foo')
} );

my $context = Catalyst->new( {
request => $request,
namespace => 'yada',
} );

# test encode first argument with utf-8,
{
$request->base( URI->new('http://127.0.0.1/') );

$context->namespace('');

is( Catalyst::uri_for( $context, '/animal/ёж', 'чёт', { param1 => "щуп" })->as_string,
'http://127.0.0.1/animal/%D1%91%D0%B6/%D1%87%D1%91%D1%82?param1=%D1%89%D1%83%D0%BF',
'URI for with first param as string in unicode'
);

is( Catalyst::uri_for( $context, '/??', '?', { param1 => "?" })->as_string,
'http://127.0.0.1/%3F%3F/%3F?param1=%3F',
'URI for with special char <?> in args and param'
);

}




--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

May 29, 2008, 7:17 AM

Post #15 of 17 (363 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

Folks, what about the problem?
Did you test my last patch?




--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dbix-class at trout

May 30, 2008, 12:05 AM

Post #16 of 17 (350 views)
Permalink
Re: uri_for() doesn't encode to utf8 first argument [In reply to]

On Thu, May 29, 2008 at 06:17:32PM +0400, Dmitriy S. Sinyavskiy wrote:
> Folks, what about the problem?
> Did you test my last patch?

We're still waiting for one to test.

You've not yet AFAIK posted one that's (a) a full diff -ur including tests
(b) has no pointless whitespaces changes.

--
Matt S Trout Need help with your Catalyst or DBIx::Class project?
Technical Director http://www.shadowcat.co.uk/catalyst/
Shadowcat Systems Ltd. Want a managed development or deployment platform?
http://chainsawblues.vox.com/ http://www.shadowcat.co.uk/servers/

_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


dreel at bk

Jun 1, 2008, 1:34 PM

Post #17 of 17 (299 views)
Permalink
Re[2]: uri_for() doesn't encode to utf8 first argument [In reply to]

Hello, Matt.
You write 30 мая 2008 г., 11:05:49:

MST> On Thu, May 29, 2008 at 06:17:32PM +0400, Dmitriy S. Sinyavskiy wrote:
>> Folks, what about the problem?
>> Did you test my last patch?

MST> We're still waiting for one to test.

MST> You've not yet AFAIK posted one that's (a) a full diff -ur including tests
MST> (b) has no pointless whitespaces changes.


As I remember the diff without pointless spaces was here http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/msg03184.html
The test http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/msg03247.html

If you prefer to see it together, look:

Index: t/unit_core_uri_for.t
===================================================================
--- t/unit_core_uri_for.t (revision 7807)
+++ t/unit_core_uri_for.t (working copy)
@@ -59,6 +59,23 @@
'URI for undef action with query params in unicode'
);

+# test encode first argument with utf-8,
+{
+$request->base( URI->new('http://127.0.0.1/') );
+
+$context->namespace('');
+
+is( Catalyst::uri_for( $context, '/animal/ёж', 'чёт', { param1 => "щуп" })->as_string,
+'http://127.0.0.1/animal/%D1%91%D0%B6/%D1%87%D1%91%D1%82?param1=%D1%89%D1%83%D0%BF',
+'URI for with first param as string in unicode'
+);
+
+is( Catalyst::uri_for( $context, '/??', '?', { param1 => "?" })->as_string,
+'http://127.0.0.1/%3F%3F/%3F?param1=%3F',
+'URI for with special char <?> in args and param'
+);
+
+
# test with object
is(
Catalyst::uri_for( $context, 'quux', { param1 => $request->base } )->as_string,
Index: lib/Catalyst.pm
===================================================================
--- lib/Catalyst.pm (revision 7807)
+++ lib/Catalyst.pm (working copy)
@@ -948,10 +948,12 @@
my $params =
( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );

+ $path =~ s!/+!/!g; # strip extra slashes '///'
+ unshift(@args, split('/', $path));
carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;

- unshift(@args, $path);
+

unless (defined $path && $path =~ s!^/!!) { # in-place strip
my $namespace = $c->namespace;



--
dreel mailto:dreel[at]bk.ru
Dmitriy S. Sinyavskiy
Web-developer Perl, Catalyst, MSSQL
FGUE EZAN Telecommunication, data transfer networks and devices.


_______________________________________________
List: Catalyst[at]lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst[at]lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Catalyst users RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact lists@gossamer-threads.com
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.