v3.00 release
[perl/plp/.git] / plp.cgi
1 #!/usr/local/bin/perl
2 use v5.6.0;
3 use PLP;
4
5 die 'Wrong module version' if $PLP::VERSION ne '3.00';
6
7 use vars qw($DEBUG);
8
9 use strict;
10 {
11     $PLP::code = '';
12     $PLP::sentheaders = 0;
13     $PLP::inA = 0;
14     $PLP::inB = 0;
15 }
16
17 $DEBUG = 1;
18 our $mod_perl = exists $ENV{MOD_PERL};
19
20 {
21     my $file = $ENV{PATH_TRANSLATED};
22     $ENV{PLP_NAME} = $ENV{PATH_INFO};
23     my $path_info;
24     while (not -f $file) {
25         if (not $file =~ s/(\/+[^\/]*)$//) {
26             $ENV{REDIRECT_STATUS} = '404';
27             print STDERR "PLP: Not found: $file\n";
28
29             if ($mod_perl) {
30                 Apache->request->uri($ENV{REQUEST_URI});
31                 print STDOUT "Status: 404 Not Found";
32                 Apache::exit();
33             } else {
34                 print STDOUT "Status: 404 Not Found\n\nNot found: $ENV{REQUEST_URI}";
35                 exit;
36             }
37         }
38         my $pi = $1;
39         $ENV{PLP_NAME} =~ s/\Q$pi\E$//;
40         $path_info = $pi . $path_info;
41     }
42     
43     if ($mod_perl) {
44         Apache->request->uri($ENV{REQUEST_URI});
45     }
46
47     if (not -r $file) {
48         if (exists $ENV{MOD_PERL}) {
49             print STDOUT "Status: 403 Forbidden";
50             Apache::exit();
51         } else {
52             print STDOUT "Status: 403 Forbidden\n\nForbidden: $ENV{REQUEST_URI}";
53             exit;
54         }
55     }
56
57     delete @ENV{
58         qw(PATH_TRANSLATED SCRIPT_NAME SCRIPT_FILENAME PATH_INFO),
59         grep { /^REDIRECT_/ } keys %ENV
60     };
61
62     $ENV{PATH_INFO} = $path_info if defined $path_info;
63     $ENV{PLP_FILENAME} = $file;
64     (my $dir = $file) =~ s{/[^/]+$}[];
65     chdir $dir;
66
67     $PLP::code = PLP::source($file, 0);
68     tie *PLPOUT, 'PLP::Tie::Print';
69     select PLPOUT;
70 }
71
72 {
73     no strict;
74     PLP::Fields::doit();
75     {
76         package PLP::Script;
77         *headers = \%header;
78         *cookies = \%cookie;
79         PLP::Functions->import();
80         eval qq{package PLP::Script; $PLP::code};
81     }
82     select STDOUT;
83     undef *{"PLP::Script::$_"} for keys %PLP::Script::;
84     PLP::SendHeaders() unless $PLP::sentheaders;
85     if ($@ && $DEBUG & 1){
86         print $header{'Content-Type'} =~ m!^text/html!i
87               ? ("<hr><b>Debug</b><br>", Entity($@))
88               : ("[Debug]\n", $@);
89     }
90 }
91