[Catalyst] Code question about Path dispatch type

Bill Moseley moseley at hank.org
Mon Mar 24 16:22:54 GMT 2008


On Mon, Mar 24, 2008 at 06:24:12AM -0700, Bill Moseley wrote:
> I noticed that register_path uses URI->canonical:
> 
> sub register_path {
>     my ( $self, $c, $path, $action ) = @_;
>     $path =~ s!^/!!;
>     $path = '/' unless length $path;
>     $path = URI->new($path)->canonical;
> 
>     unshift( @{ $self->{paths}{$path} ||= [] }, $action);
> 
>     return 1;
> }
> 
> I'm confused, when would a Path attribute be a full URI?


Oh, $path can be encoded.  That is, for a request:

    http://localhost:3000/hello%20there

then $path will be 'hello%20there'

And if there's an action:

    sub howdy : Path( 'hello there' ) {

Then:

    $ perl -MURI -le 'print URI->new("hello there")->canonical'
    hello%20there

So the dispatcher is storing 'hello%20there' and it will match the
$path.


But, why use encoded data on the inside of the application?

Here's an example of how it could fail:

If I replace an "e" with %65

    http://localhost:3000/hello%20th%65re

Which should be the same URL.

And then the dispatcher is trying to match this $path:

    hello%20th%65re

But, as above, the dispatcher is storing:

    hello%20there

so it won't match.



-- 
Bill Moseley
moseley at hank.org




More information about the Catalyst mailing list