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