Lighttpd CGI support
authorMischa POSLAWSKY <perl@shiar.org>
Wed, 25 Jul 2007 16:05:42 +0000 (18:05 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Fri, 14 Mar 2008 00:02:30 +0000 (01:02 +0100)
In case no PATH_TRANSLATED environment var is present, assume request is
already parsed and SCRIPT_* pointing to target script (not plp handler).
This supports at least Lighttpd CGI requests.  Functionality unchanged
for Apache1/2 CGI.

PLP/CGI.pm

index 2e2305993c86a33f44243182ef21e413a957354f..2056af94c5a3a0ba5dffe3eab7c7f0644dd33b7c 100644 (file)
@@ -2,45 +2,56 @@ package PLP::CGI;
 
 use strict;
 
-our $VERSION = '1.00';
+our $VERSION = '1.01';
 
 use PLP;
 
-# CGI initializer: parses PATH_TRANSLATED
+# CGI initializer: opens SCRIPT_FILENAME
 sub init {
        $PLP::print = 'print';
-       
-       my $path = $ENV{PATH_TRANSLATED};
-       $ENV{PLP_NAME} = $ENV{PATH_INFO};
-       my $path_info;
-       while (not -f $path) {
-               if (not $path =~ s/(\/+[^\/]*)$//) {
-                       print STDERR "PLP: Not found: $ENV{PATH_TRANSLATED} ($ENV{REQUEST_URI})\n";
-                       PLP::error(undef, 404);
-                       exit;
+
+       if (defined $ENV{PATH_TRANSLATED}) {
+               # Physical mapping provided; SCRIPT_* points to handler script
+               # (Apache action)
+               my $path = delete $ENV{PATH_TRANSLATED};
+               my $path_info;
+               while (not -f $path) {
+                       if (not $path =~ s/(\/+[^\/]*)$//) {
+                               printf STDERR "PLP: Not found: $path$path_info ($ENV{REQUEST_URI})\n";
+                               PLP::error(undef, 404);
+                               exit;
+                       }
+                       # move last path element from PLP_*NAME to PATH_INFO
+                       $path_info = $1 . $path_info;
+               }
+               $ENV{PLP_FILENAME} = $path;
+               $ENV{PLP_NAME} = delete $ENV{PATH_INFO};
+               if (defined $path_info) {
+                       $ENV{PLP_NAME} =~ s/\Q$path_info\E$//;
+                       $ENV{PATH_INFO} = $path_info;
                }
-               my $pi = $1;
-               $ENV{PLP_NAME} =~ s/\Q$pi\E$//;
-               $path_info = $pi . $path_info;
+       } else {
+               # SCRIPT_*/PATH_INFO already modified to target script
+               # (Lighttpd cgi.assign)
+               $ENV{PLP_FILENAME} = $ENV{SCRIPT_FILENAME};
+               $ENV{PLP_NAME} = $ENV{SCRIPT_NAME};
        }
-       
-       if (not -r $path) {
-               print STDERR "PLP: Can't read: $ENV{PATH_TRANSLATED} ($ENV{REQUEST_URI})\n";
+
+       if (not -r $ENV{PLP_FILENAME}) {
+               print STDERR "PLP: Can't read: $ENV{PLP_FILENAME} ($ENV{REQUEST_URI})\n";
                PLP::error(undef, 403);
                exit;
        }
 
        delete @ENV{
-               qw(PATH_TRANSLATED SCRIPT_NAME SCRIPT_FILENAME PATH_INFO),
+               qw(SCRIPT_NAME SCRIPT_FILENAME),
                grep /^REDIRECT_/, keys %ENV
        };
 
-       $ENV{PATH_INFO} = $path_info if defined $path_info;
-       $ENV{PLP_FILENAME} = $path;
-       my ($file, $dir) = File::Basename::fileparse($path);
+       my ($file, $dir) = File::Basename::fileparse($ENV{PLP_FILENAME});
        chdir $dir;
 
-       $PLP::code = PLP::source($file, 0, undef, $path);
+       $PLP::code = PLP::source($file, 0, undef, $ENV{PLP_FILENAME});
 }
 
 # This is run by the CGI script. (#!perl \n use PLP::CGI; PLP::CGI::everything;)