Subject: Re: gitweb, FastCGI and PSGI/Plack

From: Jakub Narebski <[email-masked]>
Date: Mon, 10 May 2010 12:32:30 +0200

On Mon, May 10, 2010, Tatsuhiko Miyagawa wrote:
> On Sun, May 9, 2010 at 4:05 PM, Jakub Narebski <[email-masked]> wrote:
>>> 
>>> `plackup -s FCGI` makes your PSGI app a fastcgi handler using FCGI.pm,
>>> or `plackup -s Net::FastCGI` does the same but using Net::FastCGI,
>>> pure perl alternative.
>>
>> It is a pity that Plack::App::WrapFCGI / FCGI::Emulate::PSGI does not
>> exist, so that gitweb.psgi wrapper would not require indirectly
>> CGI::Compile.
> 
> I *think* we discussed about this on IRC, but you still seems to be
> misunderstanding:

I'm sorry for the confusion; I didn't make myself clear (and there also
was some misunderstanding of technologies involved on my side).

> 
> You have a CGI script and you want to turn it into a PSGI application,
> hence we have CGI::Emulate::PSGI and CGI::Compile.
> 
> You usually do not have a FCGI "application". You're writing a .fcgi
> "wrapper" to make your CGI script runnable from a web server (like
> you're doing with gitweb.fcgi).

After thinking about it a bit, I realized that I don't want to have
Plack::App::WrapFCGI wrapper (which if there are no FastCGI-only Perl
web apps, e.g. using FCGI directly and which do not have support for
running as ordinary CGI would be totally unnecessary), but I want to
avoid price of using CGI::Compile.

>>From what I understand Plack::App::WrapCGI does something like that
(example taken from CGI::Compile manpage):

   use CGI::Emulate::PSGI;
   use CGI::Compile;

   my $cgi_script = "/path/to/foo.cgi";
   my $sub = CGI::Compile->compile($cgi_script);
   my $app = CGI::Emulate::PSGI->handler($sub);

   # $app is a PSGI application

A typical application that uses CGI::Fast to provide support for running
as FastCGI script looks like this, according to CGI::Fast manpage 
(the example is slightly modified):

   use CGI::Fast;

   do_some_initialization();

   while ($q = new CGI::Fast) {
      process_request();  # it uses 'my $cgi = CGI->new()' inside
   }

I'd like to use the fact that per-request part is separated from
initialization part in wrapper for PSGI.

  use CGI::Emulate::PSGI;
  use CGI::Fast::Loader; # or something like that

  my $fcgi_script = "/path/to/foo.fcgi";
  my $fcgi = CGI::Fast::Loader->load($fcgi_script);
  $fcgi->import(qw(do_some_initialization process_request));

  do_some_initialization();
  my $app = CGI::Emulate::PSGI->handler(\&process_request);

   # $app is a PSGI application

That is of course heavy handwaving, and I am not sure if it is something
that can be generalized for scripts that use FCGI module (and 
FCGI::Request) directly.

> 
> Writing an FCGI emulation layer for PSGI would allow you to run the
> FCGI wrapper from PSGI compatible web server - which does not make
> sense AT ALL!. It's even one more indirection.

Well, it would allow to run FastCGI application in *any* PSGI compatibile
web server, including standalone (HTTP::Server::PSGI), mod_perl and
Test::Plack 'server'.

Also even if wrapping FCGI application as PSGI application to run it
on FCGI server doesn't make much sense on first glance, it neverheless
allows to use many, many Plack::Middleware::*.

Mind you, I don't think that there are many FastCGI-only Perl web apps...
if there are any.

I hope that clarify what I want (and no, I guess FCGI::Emulate::PSGI
ain't it).
-- 
Jakub Narebski
Poland