From: Mischa POSLAWSKY Date: Wed, 25 Jul 2007 16:05:42 +0000 (+0200) Subject: Lighttpd CGI support X-Git-Tag: 3.20~30 X-Git-Url: http://git.shiar.net/perl/plp/.git/commitdiff_plain/65a8aed85aa78407018da99ab616f632f40a8eb9 Lighttpd CGI support 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. --- diff --git a/PLP/CGI.pm b/PLP/CGI.pm index 2e23059..2056af9 100644 --- a/PLP/CGI.pm +++ b/PLP/CGI.pm @@ -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;)