X-Git-Url: http://git.shiar.net/perl/plp/.git/blobdiff_plain/5d1c2193a6c3c98cf426e03eb783eace183e5a0c..7f913ac37060cadb76782acdc0a2df30484c40c2:/PLP/CGI.pm diff --git a/PLP/CGI.pm b/PLP/CGI.pm index 2e23059..1f46a3c 100644 --- a/PLP/CGI.pm +++ b/PLP/CGI.pm @@ -2,52 +2,77 @@ package PLP::CGI; use strict; -our $VERSION = '1.00'; +our $VERSION = '1.02'; 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; + $PLP::read = \&read; + + if (defined $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); + return; + } + # move last path element onto PATH_INFO + $path_info = $1 . $path_info; + } + if (defined $path_info) { + $rel =~ 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; + $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; } - - if (not -r $path) { - print STDERR "PLP: Can't read: $ENV{PATH_TRANSLATED} ($ENV{REQUEST_URI})\n"; + + $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{ - 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}); + 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;