generalize reading post input
[perl/plp/.git] / PLP / CGI.pm
index 2056af94c5a3a0ba5dffe3eab7c7f0644dd33b7c..56ca4db72eece75fcd434f6ed04211545ee4bc4d 100644 (file)
@@ -9,11 +9,13 @@ 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/(\/+[^\/]*)$//) {
@@ -21,21 +23,23 @@ sub init {
                                PLP::error(undef, 404);
                                exit;
                        }
-                       # 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";
@@ -54,6 +58,12 @@ sub init {
        $PLP::code = PLP::source($file, 0, undef, $ENV{PLP_FILENAME});
 }
 
+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();