[Catalyst] Catalyst and UTF8 Chained URLs

Jon Schutz jon+catalyst at youramigo.com
Wed Sep 9 09:45:47 GMT 2009


How would this patch affect systems that choose to encode their URLs in
something other than UTF-8? (Other character encodings are widely used,
particularly on Asian sites).

There might be a case for having the encoding type as a configurable
option (where one option is no decoding so the application can handle
it) - otherwise it has to be left to the application where the app
designers can reverse whatever encoding they have chosen.

-- 
Jon Schutz                        My tech notes http://notes.jschutz.net
Chief Technology Officer                        http://www.youramigo.com
YourAmigo




On 09/09/2009 11:15 AM, Rod Taylor wrote:
> I have a URL which includes UTF8 components which are in the chained
> (CaptureArgs) position. The escape mechanism is supposed encode each
> byte of the UTF8 sequence individually when creating the URL (which
> Catalyst seems to do) and reverse this on the way in.
> 
> The below adjustment appears to fix the issue I'm having with URL
> arguments not being decoded on the way in.
> 
> This may not be the right place to handle it as it could break older
> applications which work around arguments not being decoded properly to UTF8.
> 
> This makes a good test URL.
> 
> $uri = $c->uri_for( $cont->action_for($action), ['VÜ Living', '他们有理
> 性和良心' ]);
> 
> Should result in VÜ Living and 他们有理性和良心 being in the first and
> second captured arguments.
> 
> 
> *** Chained.pm.orig     Tue Sep  8 21:10:10 2009
> --- Chained.pm  Tue Sep  8 21:35:38 2009
> ***************
> *** 168,174 ****
>  
>       $request->action("/${action}");
>       $request->match("/${action}");
> !     $request->captures($captures);
>       $c->action($action);
>       $c->namespace( $action->namespace );
>  
> --- 168,187 ----
>  
>       $request->action("/${action}");
>       $request->match("/${action}");
> !
> !     # Decode Captures
> !     my $decodedCaptures = [];
> !     if ($captures && @$captures) {
> !       for my $arg (@{$captures}) {
> !             $arg =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
> !             utf8::downgrade($arg);
> !             utf8::decode($arg);
> !             push(@{$decodedCaptures}, $arg);
> !       }
> !     }
> !     $request->captures($decodedCaptures);
>       $c->action($action);
>       $c->namespace( $action->namespace );
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> 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@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/



More information about the Catalyst mailing list