<html><body><div style="color:#000; background-color:#fff; font-family:verdana, helvetica, sans-serif;font-size:13px"><div dir="ltr"><span>I just found out about Gazelle this morning - looks reeeeeally cool for PSGI apps.</span></div><div dir="ltr"><span><br></span></div><div dir="ltr" id="yui_3_16_0_1_1433854606393_17964"><a href="https://metacpan.org/pod/Gazelle" id="yui_3_16_0_1_1433854606393_17963">Gazelle - Preforked Plack Handler for performance freaks - metacpan.org</a><span><br></span></div><div style="width:450px; font-family: 'Georgia', 'Times', 'Times New Roman', 'serif';margin-top:5px; margin-bottom: 5px; background-color: #ffffff;" contenteditable="false" id="enhancrCard_0" class="link-enhancr-attachment link-enhancr-element"><table class="link-enhancr-element" cellspacing="0" cellpadding="0" border="0" style="width:450px; height:auto; position: relative; display: block;"><tbody><tr class="link-enhancr-element"><td class="link-enhancr-element" colspan="7" style="height: 1px; background-color: #e5e5e5; font-size: 1px; border-collapse: collapse;"><div class="link-enhancr-element" style="height: 1px; background-color: #e5e5e5; font-size: 1px; line-height:0px;"> </div></td></tr><tr class="link-enhancr-element"><td rowspan="5" class="link-enhancr-element" style="width: 1px; background-color: #e5e5e5; font-size: 1pt; border-collapse: collapse;"><div class="link-enhancr-element" style="width: 1px; background-color: #e5e5e5; font-size: 1pt;"> </div></td><td rowspan="5" class="link-enhancr-element" style="width: 14px; background-color: #ffffff; font-size: 0pt; border-collapse: collapse;"><div class="link-enhancr-element" style="width: 14px; background-color: #ffffff; font-size: 14pt;"> </div></td><td colspan="2" class="link-enhancr-element" style="height: 6px; background-color: #ffffff; font-size: 0pt; border-collapse: collapse;"><div class="link-enhancr-element" style="height: 6px; background-color: #ffffff; font-size: 6pt;"> </div></td><td rowspan="5" class="link-enhancr-element" style="width: 20px; background-color: #ffffff; font-size: 0pt; border-collapse: collapse;"><div class="link-enhancr-element" style="width: 20px; background-color: #ffffff; font-size: 20pt;"> </div></td><td class="link-enhancr-element" rowspan="5" width="1" style="width: 1px; background-color: #e5e5e5; font-size: 1pt; border-collapse: collapse;"><div class="link-enhancr-element" style="width: 1px; background-color: #e5e5e5; font-size: 1pt;"> </div></td></tr><tr><td class="link-enhancr-element" colspan="2" style="width: 100%; vertical-align: middle; font-family: 'Georgia', 'Times', 'Times New Roman', 'serif';"><div class="link-enhancr-text-part link-enhancr-element" style="line-height:16.5px; background-color: #ffffff;  width: 414px;"><div class="link-enhancr-element" style="word-wrap: break-word; word-break: break-all;"><span class="link-enhancr-element icon  icon-shrink link-enhancr-toggle"></span><span class="link-enhancr-element icon icon-close link-enhancr-delete"></span><a href="https://metacpan.org/pod/Gazelle" class="link-enhancr-card-urlWrapper link-enhancr-element" style="text-decoration: none !important; color: #000000 !important; line-height: 100%; font-size: 18px; display: block;"><span class="link-enhancr-element link-enhancr-card-title" style="margin: 0; font-weight: normal;margin-bottom: 3px; font-size: 18px; line-height: 21px; max-height: 43px; color: #000000; overflow: hidden !important; display: inline-block;">Gazelle - Preforked Plack Handler for performance freaks - metacpan.org</span></a><div style="font-size: 13px; line-height: 20px; color: #999999; max-height: 81px; font-family: 'Georgia', 'Times', 'Times New Roman', 'serif';overflow: hidden;" class="link-enhancr-card-description link-enhancr-element">Preforked Plack Handler for performance freaks</div></div></div></td></tr><tr><td colspan="2" class="link-enhancr-element" style="height: 6px; background-color: #ffffff; font-size: 0pt; border-collapse: collapse;"><div class="link-enhancr-element" style="height: 6px; background-color: #ffffff; font-size: 6pt;"></div></td></tr><tr><td class="link-enhancr-element" style="vertical-align: middle; font-family: 'Arial', 'Helvetica Neue', 'Helvetica', 'sans-serif';"><div class="link-enhancr-element" style="font-size: 0pt;"><a href="https://metacpan.org/pod/Gazelle" class="link-enhancr-card-url link-enhancr-element" style="color: black; text-decoration: none !important;cursor:pointer !important;" target="_blank"><span class="link-enhancr-element link-enhancr-view-on" style="display: inline-block; line-height: 11px; max-width: 314px; min-width: 254px; overflow: hidden; max-height: 13px; word-break: break-all;" id="yui_3_16_0_1_1433854606393_17996"><span class="link-enhancr-element link-enhancr-mobile-no-resize" style="vertical-align:middle; font-size: 9px; line-height: 11px; color: #999999; -moz-text-size-adjust: none; -ms-text-size-adjust: none; -webkit-text-size-adjust:none; text-size-adjust:none;">View on <span style="font-weight: bold" class="link-enhancr-view-on-domain">metacpan.org</span></span></span></a></div></td><td class="link-enhancr-element" style="vertical-align: middle; width: 100px; font-family: 'Arial', 'Helvetica Neue', 'Helvetica', 'sans-serif';"><div class="link-enhancr-element link-enhancr-preview-wrapper" style="max-width: 100px; min-width: 80px; overflow: hidden; text-align: right; line-height: 11px; max-height: 13px; font-size: 0pt;"><span class="link-enhancr-element link-enhancr-preview-by link-enhancr-mobile-no-resize" style="vertical-align:middle; font-size: 9px; line-height: 11px; color: #999999; -moz-text-size-adjust: none; -ms-text-size-adjust: none; -webkit-text-size-adjust:none; text-size-adjust:none;">Preview by Yahoo</span></div></td></tr><tr><td colspan="2" class="link-enhancr-element" style="height: 9px; background-color: #ffffff; font-size: 0pt; border-collapse: collapse;"><div class="link-enhancr-element" style="height: 9px; background-color: #ffffff; font-size: 9pt;"></div></td></tr><tr class="link-enhancr-element"><td class="link-enhancr-element" colspan="7" style="height: 1px; background-color: #e5e5e5; font-size: 1px; border-collapse: collapse;"><div class="link-enhancr-element" style="height: 1px; background-color: #e5e5e5; font-size: 1px; line-height:0px"> </div></td></tr></tbody></table></div>  <div dir="ltr" class="" style=""><span class="" style=""><br class="" style=""></span></div><br><div class="qtdSeparateBR"><br><br></div><div class="yahoo_quoted" style="display: block;"> <div style="font-family: verdana, helvetica, sans-serif; font-size: 13px;"> <div style="font-family: HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif; font-size: 16px;"> <div dir="ltr"> <font size="2" face="Arial"> On Monday, June 8, 2015 10:32 PM, Michael R. Davis <mrdvt92@yahoo.com> wrote:<br> </font> </div>  <br><br> <div class="y_msg_container"><div id="yiv1790217647"><div><div style="color:#000;background-color:#fff;font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:16px;"><div id="yiv1790217647yui_3_16_0_1_1433795419408_47535">Perl Folks,</div><div> </div><div><br clear="none">>>> 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="yiv1790217647yui_3_16_0_1_1433795419408_47536"> </div><div> </div><div dir="ltr" id="yiv1790217647yui_3_16_0_1_1433795419408_47557">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="yiv1790217647yui_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 clear="none"></div><div> </div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47625">$ cat plack-builder-mount-deamon-folder.pl<br clear="none">#!/usr/bin/perl<br clear="none">use strict;<br clear="none">use warnings;<br clear="none">use Plack::App::URLMap qw{};<br clear="none">use Plack::Util qw{};</div><div dir="ltr" id="yiv1790217647yui_3_16_0_1_1433795419408_47626">my %filenames = (<br clear="none">                 '/p0' => 'plack.psgi', #works<br clear="none">                 '/p1' => 'plack.psgi', #works<br clear="none">                 '/p2' => 'plack.psgi', #works<br clear="none">                 '/p3' => 'plack.psgi', #works<br clear="none">                 '/p4' => 'plack.psgi', #works<br clear="none">                 '/p5' => 'plack.psgi', #works<br clear="none">                 '/m1' => 'mojo-lite-1.psgi', #works<br clear="none">                 '/m2' => 'mojo-lite-2.psgi', #fails<br clear="none">                 '/m3' => 'mojo-lite-3.psgi', #fails<br clear="none">                 '/m4' => 'mojo-lite-4.psgi', #fails<br clear="none">                 '/m5' => 'mojo-lite-5.psgi', #fails<br clear="none">                );</div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47627">my $mapper    = Plack::App::URLMap->new;</div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47628">foreach my $mount (sort keys %filenames) {<br clear="none">  my $filename = $filenames{$mount};<br clear="none">  my $app      = Plack::Util::load_psgi($filename) or die($@);<br clear="none">  die($@) unless ref($app) eq "CODE";<br clear="none">  $mapper->map($mount => $app);<br clear="none">  print "Mapped: $mount to $filename ($app)\n";<br clear="none">}</div><div dir="ltr" id="yiv1790217647yui_3_16_0_1_1433795419408_47629">my $system = $mapper->to_app;<br clear="none"> </div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47539">---</div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47630"> </div><div dir="ltr">$ cat plack.psgi</div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47631">#!/usr/bin/perl<br clear="none">use Plack::Builder;</div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47632">my $app = sub {<br clear="none">  my $env = shift;<br clear="none">  return [<br clear="none">           200,<br clear="none">           [ "Content-Type" => "text/plain", "Content-Length" => 11 ],<br clear="none">           [ "Hello World" ],<br clear="none">         ];<br clear="none">};</div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47597">builder {<br clear="none">  enable "Auth::Basic", authenticator => \&authen_cb;<br clear="none">  $app;<br clear="none">};</div><div dir="ltr" id="yiv1790217647yui_3_16_0_1_1433795419408_47598">sub authen_cb {<br clear="none">  my($username, $password, $env) = @_;<br clear="none">  return $username eq 'user' && $password eq 'pass';<br clear="none">}<br clear="none"></div><div dir="ltr">---</div><div dir="ltr"> </div><div dir="ltr">$ cat mojo-lite.psgi<br clear="none">#perl<br clear="none">use strict;<br clear="none">use warnings;<br clear="none">use Plack::Builder qw{builder enable mount};<br clear="none">use Mojolicious::Lite qw{app};<br clear="none">use DateTime;</div><div dir="ltr">get '/' => sub {<br clear="none">  my $c = shift;<br clear="none">  $c->render(<br clear="none">             json => {<br clear="none">                      int    => 1,<br clear="none">                      float  => 2.23423,<br clear="none">                      exp    => 34.45e27,<br clear="none">                      string => "hello world!",<br clear="none">                      dt     => DateTime->now,<br clear="none">                     }<br clear="none">            );<br clear="none">};</div><div dir="ltr"> </div><div dir="ltr">get '/env' => sub {<br clear="none">  my $c = shift;<br clear="none">  $c->render(<br clear="none">             text => join("", map {sprintf "%s: %s\n", $_, $ENV{$_}} sort keys %ENV),<br clear="none">            );<br clear="none">};</div><div dir="ltr"> </div><div dir="ltr">sub authen_cb {<br clear="none">  my($username, $password, $env) = @_;<br clear="none">  return $username eq 'user' && $password eq 'pass';<br clear="none">}</div><div dir="ltr"> </div><div dir="ltr">builder {<br clear="none">  enable "Auth::Basic", authenticator => \&authen_cb; </div><div dir="ltr" id="yiv1790217647yui_3_16_0_1_1433795419408_47610">  app->start; #app from Mojolicious::Lite<div class="yiv1790217647yqt1362051762" id="yiv1790217647yqtfd42598"><br clear="none">};<br clear="none"></div></div><div class="yiv1790217647yqt1362051762" id="yiv1790217647yqtfd94874"><div id="yiv1790217647yui_3_16_0_1_1433795419408_47540">--- </div><div> </div><div id="yiv1790217647yui_3_16_0_1_1433795419408_47541">Thanks,<br clear="none">Mike<br clear="none"> <br clear="none">mrdvt92<br clear="none"></div></div></div></div></div><br><br></div>  </div> </div>  </div></div></body></html>