fixed CGI detection under mod_cgid
Christian Walde [Thu, 5 Jul 2012 11:10:19 +0000 (13:10 +0200)]
The Apache module mod_cgid is default in modern Apaches with
multi-threaded MPM and opens STDIN as a Socket, so interpreting that fact
to mean that we're under FastCGI works ONLY if $ENV{GATEWAY_INTERFACE} is
not set.

See: http://httpd.apache.org/docs/2.0/mod/mod_cgid.html

Exception: Some nginx FastCGI configuration examples (probably as a result
of copy/paste) instruct the user to set:
$ENV{GATEWAY_INTERFACE} = "CGI 1.1"
If anyone actually did that, FastCGI would be wrongly recognized as CGI in
their case.

See: http://wiki.nginx.org/FcgiExample

lib/Web/Simple/Application.pm

index dbba703..24d3463 100644 (file)
@@ -87,7 +87,8 @@ sub run {
   my $self = shift;
   if (
     $ENV{PHP_FCGI_CHILDREN} || $ENV{FCGI_ROLE} || $ENV{FCGI_SOCKET_PATH}
-    || -S STDIN # STDIN is a socket, almost certainly FastCGI
+    || ( -S STDIN && !$ENV{GATEWAY_INTERFACE} )
+    # If STDIN is a socket, almost certainly FastCGI, except for mod_cgid
     ) {
     return $self->_run_fcgi;
   } elsif ($ENV{GATEWAY_INTERFACE}) {