use strict;
-our $VERSION = '1.01';
+our $VERSION = '1.02';
use PLP;
# CGI initializer: opens SCRIPT_FILENAME
sub init {
$PLP::print = 'print';
+ $PLP::read = \&read;
if (defined $ENV{PATH_TRANSLATED}) {
- # Physical mapping provided; SCRIPT_* points to handler script
- # (Apache action)
- my $path = delete $ENV{PATH_TRANSLATED};
+ # SCRIPT_* points to handler script (Apache CGI)
+ # Run backwards through PATH_TRANSLATED to find target filename,
+ # then get file (relative) by stripping PATH_INFO.
+ my ($path, $rel) = (delete $ENV{PATH_TRANSLATED}, delete $ENV{PATH_INFO});
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;
+ return;
}
- # move last path element from PLP_*NAME to PATH_INFO
+ # move last path element onto 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$//;
+ $rel =~ s/\Q$path_info\E$//;
$ENV{PATH_INFO} = $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};
+ $ENV{SCRIPT_FILENAME} = $path;
+ $ENV{SCRIPT_NAME} = $rel;
}
+ elsif (not -f $ENV{SCRIPT_FILENAME}) {
+ print STDERR "PLP: Not found: $ENV{SCRIPT_FILENAME} ($ENV{REQUEST_URI})\n";
+ PLP::error(undef, 404);
+ return;
+ }
+
+ $ENV{"PLP_$_"} = $ENV{"SCRIPT_$_"} for qw/NAME FILENAME/;
if (not -r $ENV{PLP_FILENAME}) {
print STDERR "PLP: Can't read: $ENV{PLP_FILENAME} ($ENV{REQUEST_URI})\n";
PLP::error(undef, 403);
- exit;
+ return;
}
delete @ENV{
chdir $dir;
$PLP::code = PLP::source($file, 0, undef, $ENV{PLP_FILENAME});
+ return 1;
+}
+
+sub read ($) {
+ my ($bytes) = @_;
+ read *STDIN, my $data, $bytes;
+ return $data;
}
-# This is run by the CGI script. (#!perl \n use PLP::CGI; PLP::CGI::everything;)
sub everything {
PLP::clean();
- init();
- PLP::start();
+ $_[0]->init() and PLP::start();
+}
+
+# This is run by the CGI script. (#!perl \n use PLP::CGI;)
+sub import {
+ $_[0]->everything();
}
1;