warn pre-start() errors
[perl/plp/.git] / lib / PLP / Backend / CGI.pm
1 package PLP::Backend::CGI;
2
3 use strict;
4 use warnings;
5
6 our $VERSION = '1.03';
7
8 use PLP;
9
10 # CGI initializer: opens SCRIPT_FILENAME
11 sub init {
12         $PLP::print = 'print';
13         $PLP::read = \&read;
14
15         if (defined $ENV{PATH_TRANSLATED}) {
16                 # SCRIPT_* points to handler script (Apache CGI)
17                 # Run backwards through PATH_TRANSLATED to find target filename,
18                 # then get file (relative) by stripping PATH_INFO.
19                 my ($path, $rel) = (delete $ENV{PATH_TRANSLATED}, delete $ENV{PATH_INFO});
20                 my $path_info = '';
21                 while (not -f $path) {
22                         if (not $path =~ s/(\/+[^\/]*)$//) {
23                                 warn "PLP: Not found: $path$path_info ($ENV{REQUEST_URI})\n";
24                                 PLP::error(undef, 404);
25                                 return;
26                         }
27                         # move last path element onto PATH_INFO
28                         $path_info = $1 . $path_info;
29                 }
30                 if ($path_info ne '') {
31                         $rel =~ s/\Q$path_info\E$//;
32                         $ENV{PATH_INFO} = $path_info;
33                 }
34                 $ENV{SCRIPT_FILENAME} = $path;
35                 $ENV{SCRIPT_NAME} = $rel;
36         }
37         elsif (not -f $ENV{SCRIPT_FILENAME}) {
38                 warn "PLP: Not found: $ENV{SCRIPT_FILENAME} ($ENV{REQUEST_URI})\n";
39                 PLP::error(undef, 404);
40                 return;
41         }
42
43         $ENV{"PLP_$_"} = $ENV{"SCRIPT_$_"} for qw/NAME FILENAME/;
44
45         if (not -r $ENV{PLP_FILENAME}) {
46                 warn "PLP: Can't read: $ENV{PLP_FILENAME} ($ENV{REQUEST_URI})\n";
47                 PLP::error(undef, 403);
48                 return;
49         }
50
51         delete @ENV{
52                 grep /^REDIRECT_/, keys %ENV
53         };
54
55         my ($file, $dir) = File::Basename::fileparse($ENV{PLP_FILENAME});
56         chdir $dir;
57
58         $PLP::code = PLP::source($file, 0, undef, $ENV{PLP_FILENAME});
59         return 1;
60 }
61
62 sub read ($) {
63         my ($bytes) = @_;
64         read *STDIN, my ($data), $bytes;
65         return $data;
66 }
67
68 sub everything {
69         PLP::clean();
70         $_[0]->init() and PLP::start();
71 }
72
73 # This is run by the CGI script. (#!perl \n use PLP::Backend::CGI;)
74 sub import {
75         $PLP::interface = $_[0];
76         $_[0]->everything();
77 }
78
79 1;
80
81 =head1 NAME
82
83 PLP::Backend::CGI - CGI interface for PLP
84
85 =head1 SYNOPSIS
86
87 For most servers you'll need a script executable.
88 Example F</foo/bar/plp.cgi>:
89
90     #!/usr/bin/perl
91     use PLP::Backend::CGI;
92
93 Or install the C<plp.cgi> included with PLP.
94
95 =head2 Lighttpd
96
97 Add this to your configuration file (usually F</etc/lighttpd/lighttpd.conf>):
98
99     server.modules += ("mod_cgi")
100     cgi.assign += (".plp" => "/foo/bar/plp.cgi")
101     server.indexfiles += ("index.plp")
102     static-file.exclude-extensions += (".plp")
103
104 =head2 Apache
105
106 Enable I<mod_actions> and
107 setup F<httpd.conf> (in new installs just create F</etc/apache/conf.d/plp>) with:
108
109     <IfModule mod_actions.c>
110         ScriptAlias /PLP_COMMON/ /foo/bar/
111         <Directory /foo/bar/>
112             Options +ExecCGI
113             Order allow,deny
114             Allow from all
115         </Directory>
116         AddHandler plp-document plp
117         Action plp-document /PLP_COMMON/plp.cgi
118     </IfModule>
119
120 =head1 AUTHOR
121
122 Mischa POSLAWSKY <perl@shiar.org>
123
124 =head1 SEE ALSO
125
126 L<PLP>, L<PLP::Backend::FastCGI>
127