<html><body><div style="color:#000; background-color:#fff; font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:16px"><div id="yui_3_16_0_1_1433795419408_47535">Perl Folks,</div><div> </div><div><br>>>> hoping that someone had already packaged up an RPM/PKG like Apache where I could just drop my PSGI script in the /etc/starman/pgsi/ folder and be off and running. </div><div id="yui_3_16_0_1_1433795419408_47536"> </div><div> </div><div id="yui_3_16_0_1_1433795419408_47557" dir="ltr">Here's a cool URL mapper for Plack apps. It works great for Plack apps but it fails to pull in more than the first Mojo app. I have no idea why but load_psgi (`do "$filename"`) must work differently after the first Mojo app is loaded.</div><div id="yui_3_16_0_1_1433795419408_47537"> </div><div dir="ltr">Error: "Can't use string ("Mojolicious::Commands") as a subroutine ref while "strict refs" in use at /usr/share/perl5/vendor_perl/Plack/Middleware/Auth/Basic.pm line 30."<br></div><div> </div><div id="yui_3_16_0_1_1433795419408_47625">$ cat plack-builder-mount-deamon-folder.pl<br>#!/usr/bin/perl<br>use strict;<br>use warnings;<br>use Plack::App::URLMap qw{};<br>use Plack::Util qw{};</div><div id="yui_3_16_0_1_1433795419408_47626" dir="ltr">my %filenames = (<br> '/p0' => 'plack.psgi', #works<br> '/p1' => 'plack.psgi', #works<br> '/p2' => 'plack.psgi', #works<br> '/p3' => 'plack.psgi', #works<br> '/p4' => 'plack.psgi', #works<br> '/p5' => 'plack.psgi', #works<br> '/m1' => 'mojo-lite-1.psgi', #works<br> '/m2' => 'mojo-lite-2.psgi', #fails<br> '/m3' => 'mojo-lite-3.psgi', #fails<br> '/m4' => 'mojo-lite-4.psgi', #fails<br> '/m5' => 'mojo-lite-5.psgi', #fails<br> );</div><div id="yui_3_16_0_1_1433795419408_47627">my $mapper = Plack::App::URLMap->new;</div><div id="yui_3_16_0_1_1433795419408_47628">foreach my $mount (sort keys %filenames) {<br> my $filename = $filenames{$mount};<br> my $app = Plack::Util::load_psgi($filename) or die($@);<br> die($@) unless ref($app) eq "CODE";<br> $mapper->map($mount => $app);<br> print "Mapped: $mount to $filename ($app)\n";<br>}</div><div id="yui_3_16_0_1_1433795419408_47629" dir="ltr">my $system = $mapper->to_app;<br> </div><div id="yui_3_16_0_1_1433795419408_47539">---</div><div id="yui_3_16_0_1_1433795419408_47630"> </div><div dir="ltr">$ cat plack.psgi</div><div id="yui_3_16_0_1_1433795419408_47631">#!/usr/bin/perl<br>use Plack::Builder;</div><div id="yui_3_16_0_1_1433795419408_47632">my $app = sub {<br> my $env = shift;<br> return [<br> 200,<br> [ "Content-Type" => "text/plain", "Content-Length" => 11 ],<br> [ "Hello World" ],<br> ];<br>};</div><div id="yui_3_16_0_1_1433795419408_47597">builder {<br> enable "Auth::Basic", authenticator => \&authen_cb;<br> $app;<br>};</div><div id="yui_3_16_0_1_1433795419408_47598" dir="ltr">sub authen_cb {<br> my($username, $password, $env) = @_;<br> return $username eq 'user' && $password eq 'pass';<br>}<br></div><div dir="ltr">---</div><div dir="ltr"> </div><div dir="ltr">$ cat mojo-lite.psgi<br>#perl<br>use strict;<br>use warnings;<br>use Plack::Builder qw{builder enable mount};<br>use Mojolicious::Lite qw{app};<br>use DateTime;</div><div dir="ltr">get '/' => sub {<br> my $c = shift;<br> $c->render(<br> json => {<br> int => 1,<br> float => 2.23423,<br> exp => 34.45e27,<br> string => "hello world!",<br> dt => DateTime->now,<br> }<br> );<br>};</div><div dir="ltr"> </div><div dir="ltr">get '/env' => sub {<br> my $c = shift;<br> $c->render(<br> text => join("", map {sprintf "%s: %s\n", $_, $ENV{$_}} sort keys %ENV),<br> );<br>};</div><div dir="ltr"> </div><div dir="ltr">sub authen_cb {<br> my($username, $password, $env) = @_;<br> return $username eq 'user' && $password eq 'pass';<br>}</div><div dir="ltr"> </div><div dir="ltr">builder {<br> enable "Auth::Basic", authenticator => \&authen_cb; </div><div id="yui_3_16_0_1_1433795419408_47610" dir="ltr"> app->start; #app from Mojolicious::Lite<br>};<br></div><div id="yui_3_16_0_1_1433795419408_47540">--- </div><div> </div><div id="yui_3_16_0_1_1433795419408_47541">Thanks,<br>Mike<br> <br>mrdvt92<br></div></div></body></html>