PATH_INFO and Router::Simple
Dear Miyagawa san,
Plack::Builder's mount function makes empty string PATH_INFO on following case.
use v5.14.0; use Plack::Builder; use Plack::Util; use Test::More; use Plack::Test; use Plack; note "Plack: $Plack::VERSION"; my $app = builder { mount '/app/' => sub { my $env = shift; [200, [], [$env->{PATH_INFO}]]; }; }; test_psgi app => $app, client => sub { my $cb = shift; { my $req = HTTP::Request->new( GET => "http://localhost/app" ); my $res = $cb->($req); is $res->content, ''; } { my $req = HTTP::Request->new( GET => "http://localhost/app/" ); my $res = $cb->($req); is $res->content, '/'; } }; done_testing;
Result is here
# Plack: 1.0004 ok 1 ok 2 1..2
So, should path router support empty string to replace '/'? i.e. should I apply following patch for Router::Simple?
diff --git a/lib/Router/Simple.pm b/lib/Router/Simple.pm index de1651a..8dd260a 100644 --- a/lib/Router/Simple.pm +++ b/lib/Router/Simple.pm @@ -32,7 +32,13 @@ sub submapper { sub _match { my ($self, $env) = @_; - $env = +{ PATH_INFO => $env } unless ref $env; + if (ref $env) { + if ($env->{PATH_INFO} eq '') { + $env->{PATH_INFO} = '/'; + } + } else { + $env = +{ PATH_INFO => $env } + } for my $route (@{$self->{routes}}) { my $match = $route->match($env);
@tokuhirom I think there was a discussion about that a while ago and it is up to apps to deal with empty PATH_INFO as root / iirc
— Tatsuhiko Miyagawa (@miyagawa) October 5, 2012