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
Published: 2012-10-05(Fri) 04:23