From 0dbf6bc1fe5cd28c532994d13836e9509fcbe194 Mon Sep 17 00:00:00 2001 From: Mischa POSLAWSKY Date: Tue, 2 Oct 2007 12:23:27 +0200 Subject: [PATCH] FastCGI interface (PLP::CGI extension using FCGI) Do not exit from PLP::CGI, allowing it to be used consecutively. Coincidentally, PLP::FastCGI does just that: extending the PLP::CGI interface to handle FCGI requests. Its import() runs a PLP dispatcher, so a FastCGI executable (example plp.fcgi is provided) only has to C. If a server supports run arguments, a wrapper script isn't even needed this way: just do /usr/bin/perl -MPLP::FastCGI. PATH_TRANSLATED is explicitly removed from environment so file names are gotten from SCRIPT_*, which mostly already point to the requested script (at least much more correctly than can be determined from PATH_*). This seems to work correctly on at least: - Apache 1.3.34, 2.2.4, 2.2.8 with mod_fastcgi and mod_fcgid - Lighttpd 1.4.7 and 1.4.18 with mod_fastcgi Caching can be controlled by setting an environment variable PLP_CACHE (unlike with mod_perl, no other means of configuration are provided). If not specified, PLPcache will be turned on. fcgi script --- PLP/CGI.pm | 10 +++++----- PLP/FastCGI.pm | 22 ++++++++++++++++++++++ plp.fcgi | 7 +++++++ 3 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 PLP/FastCGI.pm create mode 100755 plp.fcgi diff --git a/PLP/CGI.pm b/PLP/CGI.pm index 56ca4db..817a552 100644 --- a/PLP/CGI.pm +++ b/PLP/CGI.pm @@ -2,7 +2,7 @@ package PLP::CGI; use strict; -our $VERSION = '1.01'; +our $VERSION = '1.02'; use PLP; @@ -21,7 +21,7 @@ sub init { if (not $path =~ s/(\/+[^\/]*)$//) { printf STDERR "PLP: Not found: $path$path_info ($ENV{REQUEST_URI})\n"; PLP::error(undef, 404); - exit; + return; } # move last path element onto PATH_INFO $path_info = $1 . $path_info; @@ -44,7 +44,7 @@ sub init { 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{ @@ -56,6 +56,7 @@ sub init { chdir $dir; $PLP::code = PLP::source($file, 0, undef, $ENV{PLP_FILENAME}); + return 1; } sub read ($) { @@ -67,8 +68,7 @@ sub read ($) { # 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(); } 1; diff --git a/PLP/FastCGI.pm b/PLP/FastCGI.pm new file mode 100644 index 0000000..e16fbcb --- /dev/null +++ b/PLP/FastCGI.pm @@ -0,0 +1,22 @@ +package PLP::FastCGI; + +use strict; + +use PLP::CGI; +use FCGI; +use base 'PLP::CGI'; + +our $VERSION = '1.00'; + +sub import { + my $self = shift; + my $request = FCGI::Request(); + while ($request->Accept() >= 0) { + $PLP::use_cache = !defined $ENV{PLP_CACHE} || $ENV{PLP_CACHE}; # before it's clean()ed + delete $ENV{PATH_TRANSLATED}; + $self->everything(); + } +} + +1; + diff --git a/plp.fcgi b/plp.fcgi new file mode 100755 index 0000000..372459e --- /dev/null +++ b/plp.fcgi @@ -0,0 +1,7 @@ +#!/usr/bin/env perl + +# This is a dispatch script for FastCGI installations. +# It is not needed with normal CGI or mod_perl. + +use PLP::FastCGI; + -- 2.30.0