This I'm trying for transfer my current Apache/Modperl site to Starman, and need build app.psgi with different handlers for different file extensions. Somthing as in the Apache:
<LocationMatch "(\.m|\.mh|\/)$">
SetHandler perl-script
PerlHandler MyApp::Mhandler
</LocationMatch>
<LocationMatch "(\.p|\.ph)$">
SetHandler perl-script
PerlHandler MyApp::Phandler
</LocationMatch>
Now I have:
#app for handle .m and .mh
my $Mapp = Some::PSGI->handler( sub {
...
});
#app for handling .p and .ph
my $Papp = SomeOther::PSGI->handler( sub {
...
});
but how to use the builder?
builder {
#any extension what is not .m .mh .p .ph - handle as static
#but, only when the request have any extension
enable "Plack::Middleware::Static",
path => __what here__, ???
root => "/my/doc/root";
#and what here to achieve the following "rules".
#??? $Papp
#default $Mapp
};
Needed "rules":
$Mapp
.m
and .mh
should be handled by $Mapp
.p
and .ph
should be handled by $Papp
Sure, will be much easier put every static file into some tree, but the current app is given and now i only want move it into Startman, refactoring - later.
use strictures;
use Plack::Request qw();
use Plack::Builder qw(builder enable);
use Tie::REHash do_cache => 1;
tie my %location_match, 'Tie::REHash';
%location_match = (
qr'(\.m|\.mh|/|/[^.]+)$' => sub {[200,[],['Mhandler']]},
qr'(\.p|\.ph)$' => sub {[200,[],['Phandler']]},
);
my $app = sub {
my ($env) = @_;
my $req = Plack::Request->new($env);
my $res;
if ($location_match{$req->path_info}) {
printf "path [%s] dispatches to %s\n", $req->path_info, $location_match{$req->path_info};
$res = $location_match{$req->path_info};
} else {
die sprintf "no match for path [%s], check routing configuration\n", $req->path_info;
}
return $res->($env);
};
builder {
enable 'Static', path => sub {
my ($path) = @_;
if ($location_match{$path}) {
print "redispatch\n";
return;
} elsif ($path =~ qr'/ [^/]+ [.] [^/]+ $'x) {
return 1;
} else {
die "no match for path [$path], check routing configuration\n";
}
}, root => './htdocs/';
$app;
}
__END__
GET 'http://localhost:5000/foo?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo/?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.m?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.mh?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.p?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.ph?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.css?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.js?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.pdf?bar=baz;quux#fnord'
GET 'http://localhost:5000/foo.jpg?bar=baz;quux#fnord'
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With