# Not to be used without the CGI script;
-our $VERSION = '3.01';
+our $VERSION = '3.02';
use PLP::Functions ();
use PLP::Fields;
use PLP::Tie::Delay;
use PLP::Tie::Print;
-sub SendHeaders () {
+=head1 PLP
+
+None of the functions in this module should be called by PLP scripts.
+
+Functions:
+
+=over 10
+
+=item sendheaders
+
+Sends the headers waiting in %PLP::Script::header
+
+=item source
+
+Given a filename and optional level (level should be C<0> if it isn't called
+by C<source> itself), and optional linespec (used by C<PLP::Functions::Include>),
+parses a PLP file and returns Perl code, ready to be eval'ed.
+
+=item error
+
+Given a description OR number, returns a piece of HTML, OR prints error headers.
+
+=item start
+
+Inits everything, reads the first file, sets environment.
+
+=cut
+
+sub sendheaders () {
our $sentheaders = 1;
print STDOUT "Content-Type: text/plain\n\n" if $DEBUG & 2;
print STDOUT map("$_: $PLP::Script::header{$_}\n", keys %PLP::Script::header), "\n";
}
}
+sub start {
+ my $file = $ENV{PATH_TRANSLATED};
+ $ENV{PLP_NAME} = $ENV{PATH_INFO};
+ my $path_info;
+ while (not -f $file) {
+ if (not $file =~ s/(\/+[^\/]*)$//) {
+ print STDERR "PLP: Not found: $ENV{PATH_TRANSLATED} ($ENV{REQUEST_URI})\n";
+
+ if (exists $ENV{MOD_PERL}) {
+ Apache->request->uri($ENV{REQUEST_URI});
+ print STDOUT "Status: 404 Not Found";
+ Apache::exit();
+ } else {
+ PLP::error(undef, 404);
+ exit;
+ }
+ }
+ my $pi = $1;
+ $ENV{PLP_NAME} =~ s/\Q$pi\E$//;
+ $path_info = $pi . $path_info;
+ }
+
+ if (exists $ENV{MOD_PERL}) {
+ Apache->request->uri($ENV{REQUEST_URI});
+ }
+
+ if (not -r $file) {
+ print STDERR "PLP: Can't read: $ENV{PATH_TRANSLATED} ($ENV{REQUEST_URI})\n";
+ if (exists $ENV{MOD_PERL}) {
+ print STDOUT "Status: 403 Forbidden";
+ Apache::exit();
+ } else {
+ PLP::error(undef, 403);
+ exit;
+ }
+ }
+
+ delete @ENV{
+ qw(PATH_TRANSLATED SCRIPT_NAME SCRIPT_FILENAME PATH_INFO),
+ grep { /^REDIRECT_/ } keys %ENV
+ };
+
+ $ENV{PATH_INFO} = $path_info if defined $path_info;
+ $ENV{PLP_FILENAME} = $file;
+ (my $dir = $file) =~ s{/[^/]+$}[];
+ chdir $dir;
+
+ $PLP::code = PLP::source($file, 0);
+ tie *PLPOUT, 'PLP::Tie::Print';
+ select PLPOUT;
+}
+
1;
my %get;
if ($ENV{QUERY_STRING} ne ''){
for (split /[&;]/, $ENV{QUERY_STRING}) {
- my @keyval = split /=/;
+ my @keyval = split /=/, $_, 2;
PLP::Functions::DecodeURI(@keyval);
$get{$keyval[0]} = $keyval[1] unless $keyval[0] =~ /^\@/;
push @{ $get{'@' . $keyval[0]} }, $keyval[1];
our $post = <STDIN>;
if (defined($post) && $post ne '' &&
($ENV{CONTENT_TYPE} eq '' || $ENV{CONTENT_TYPE} eq 'application/x-www-form-urlencoded')){
- for (split /[&;]/, $post) {
- my @keyval = split /=/;
+ for (split /&/, $post) {
+ my @keyval = split /=/, $_, 2;
PLP::Functions::DecodeURI(@keyval);
$post{$keyval[0]} = $keyval[1] unless $keyval[0] =~ /^\@/;
push @{ $post{'@' . $keyval[0]} }, $keyval[1];
if (defined($ENV{HTTP_COOKIE}) && $ENV{HTTP_COOKIE} ne ''){
for (split /; ?/, $ENV{HTTP_COOKIE}) {
- my @keyval = split /=/;
+ my @keyval = split /=/, $_, 2;
$PLP::Script::cookie{$keyval[0]} ||= $keyval[1];
}
}
sub PRINT {
my ($self, @param) = @_;
- PLP::SendHeaders() unless $PLP::sentheaders;
+ PLP::sendheaders() unless $PLP::sentheaders;
print STDOUT @param;
select STDOUT;
}
use v5.6.0;
use PLP;
-die 'Wrong module version' if $PLP::VERSION ne '3.01';
+die 'Wrong module version' if $PLP::VERSION ne '3.02';
use vars qw($DEBUG);
$PLP::sentheaders = 0;
$PLP::inA = 0;
$PLP::inB = 0;
+ delete @ENV{ grep /^PLP_/, keys %ENV };
}
$DEBUG = 1;
-our $mod_perl = exists $ENV{MOD_PERL};
-{
- my $file = $ENV{PATH_TRANSLATED};
- $ENV{PLP_NAME} = $ENV{PATH_INFO};
- my $path_info;
- while (not -f $file) {
- if (not $file =~ s/(\/+[^\/]*)$//) {
- print STDERR "PLP: Not found: $ENV{PATH_TRANSLATED} ($ENV{REQUEST_URI})\n";
-
- if ($mod_perl) {
- Apache->request->uri($ENV{REQUEST_URI});
- print STDOUT "Status: 404 Not Found";
- Apache::exit();
- } else {
- PLP::error(undef, 404);
- exit;
- }
- }
- my $pi = $1;
- $ENV{PLP_NAME} =~ s/\Q$pi\E$//;
- $path_info = $pi . $path_info;
- }
-
- if ($mod_perl) {
- Apache->request->uri($ENV{REQUEST_URI});
- }
-
- if (not -r $file) {
- print STDERR "PLP: Can't read: $ENV{PATH_TRANSLATED} ($ENV{REQUEST_URI})\n";
- if (exists $ENV{MOD_PERL}) {
- print STDOUT "Status: 403 Forbidden";
- Apache::exit();
- } else {
- PLP::error(undef, 403);
- exit;
- }
- }
-
- delete @ENV{
- qw(PATH_TRANSLATED SCRIPT_NAME SCRIPT_FILENAME PATH_INFO),
- grep { /^REDIRECT_/ } keys %ENV
- };
-
- $ENV{PATH_INFO} = $path_info if defined $path_info;
- $ENV{PLP_FILENAME} = $file;
- (my $dir = $file) =~ s{/[^/]+$}[];
- chdir $dir;
-
- $PLP::code = PLP::source($file, 0);
- tie *PLPOUT, 'PLP::Tie::Print';
- select PLPOUT;
-}
+PLP::start();
{
no strict;
*headers = \%header;
*cookies = \%cookie;
PLP::Functions->import();
+ # No lexicals may exist at this point.
eval qq{package PLP::Script; $PLP::code};
}
PLP::error($@, 1) if $@;
select STDOUT;
undef *{"PLP::Script::$_"} for keys %PLP::Script::;
- PLP::SendHeaders() unless $PLP::sentheaders;
+ PLP::sendheaders() unless $PLP::sentheaders;
}