X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2FFCGI.pm;h=7fa468c00bcdb79a422c073747e1297042a085a8;hb=1d2099974488682a7aaf9461625ecedaa279ae2d;hp=6439846031fc5ca9bce575199f63db4dbb39367e;hpb=d8cc97fb657c9ef33e5c6cddfff6ddd1eff0e894;p=catagits%2Ffcgi2.git diff --git a/perl/FCGI.pm b/perl/FCGI.pm index 6439846..7fa468c 100644 --- a/perl/FCGI.pm +++ b/perl/FCGI.pm @@ -1,4 +1,4 @@ -# $Id: FCGI.pm,v 1.3 1999/07/31 21:54:47 skimo Exp $ +# $Id: FCGI.pm,v 1.14 2000/11/01 15:12:27 skimo Exp $ package FCGI; @@ -13,7 +13,7 @@ require DynaLoader; ); -$VERSION = '0.47'; +$VERSION = '0.56'; bootstrap FCGI; @@ -21,19 +21,24 @@ bootstrap FCGI; # Autoload methods go after __END__, and are processed by the autosplit program. -sub request() { - Request(); -} +*FAIL_ACCEPT_ON_INTR = sub() { 1 }; -sub accept(;$***$) { - return Accept(@_) if @_ == 5; +sub Request(;***$$$) { + my @defaults = (\*STDIN, \*STDOUT, \*STDERR, \%ENV, 0, 0); + splice @defaults,0,@_,@_; + RequestX(@defaults); +} +sub accept() { if (defined %FCGI::ENV) { %ENV = %FCGI::ENV; } else { %FCGI::ENV = %ENV; } - my $rc = Accept($global_request, \*STDIN, \*STDOUT, \*STDERR, \%ENV); + my $rc = Accept($global_request); + for (keys %FCGI::ENV) { + $ENV{$_} = $FCGI::ENV{$_} unless exists $ENV{$_}; + } # not SFIO $SIG{__WARN__} = $SIG{__DIE__} = $warn_die_handler if (tied (*STDIN)); @@ -41,9 +46,7 @@ sub accept(;$***$) { return $rc; } -sub finish(;$) { - return Finish(@_) if @_ == 1; - +sub finish() { %ENV = %FCGI::ENV if (defined %FCGI::ENV); # not SFIO @@ -56,24 +59,28 @@ sub finish(;$) { Finish ($global_request); } -sub flush(;$) { - return Flush(@_) if @_ == 1; - +sub flush() { Flush($global_request); } +sub detach() { + Detach($global_request); +} + +sub attach() { + Attach($global_request); +} + # deprecated sub set_exit_status { } -sub start_filter_data(;$) { - return StartFilterData(@_) if @_ == 1; - +sub start_filter_data() { StartFilterData($global_request); } $global_request = Request(); -$warn_die_handler = sub { print STDERR @_ }; +$warn_die_handler = sub { print STDERR @_ unless $^S }; package FCGI::Stream; @@ -81,8 +88,43 @@ sub PRINTF { shift->PRINT(sprintf(shift, @_)); } +sub READLINE { + my $stream = shift; + my ($s, $c); + my $rs = $/ eq '' ? "\n\n" : $/; + my $l = substr $rs, -1; + my $len = length $rs; + + $c = $stream->GETC(); + if ($/ eq '') { + while ($c eq "\n") { + $c = $stream->GETC(); + } + } + while (defined $c) { + $s .= $c; + last if $c eq $l and substr($s, -$len) eq $rs; + $c = $stream->GETC(); + } + $s; +} + +sub OPEN { + $_[0]->CLOSE; + if (@_ == 2) { + return open($_[0], $_[1]); + } else { + my $rc; + eval("$rc = open($_[0], $_[1], $_[2])"); + die $@ if $@; + return $rc; + } +} + 1; +=pod + =head1 NAME FCGI - Fast CGI module @@ -91,8 +133,10 @@ FCGI - Fast CGI module use FCGI; - $count = 0; - while(FCGI::accept() >= 0) { + my $count = 0; + my $request = FCGI::Request(); + + while($request->Accept() >= 0) { print("Content-type: text/html\r\n\r\n", ++$count); } @@ -102,27 +146,102 @@ Functions: =over 4 -=item FCGI::accept() +=item FCGI::Request + +Creates a request handle. It has the following optional parameters: + +=over 8 + +=item input perl file handle (default: \*STDIN) + +=item output perl file handle (default: \*STDOUT) + +=item error perl file handle (default: \*STDERR) + +These filehandles will be setup to act as input/output/error +on succesful Accept. -Accepts a connection. Returns 0 on success. +=item environment hash reference (default: \%ENV) + +The hash will be populated with the environment. + +=item socket (default: 0) + +Socket to communicate with the server. +Can be the result of the OpenSocket function. +For the moment, it's the file descriptor of the socket +that should be passed. This may change in the future. + +=item flags (default: 0) + +Possible values: + +=over 12 + +=item FCGI::FAIL_ACCEPT_ON_INTR + +If set, Accept will fail if interrupted. +It not set, it will just keep on waiting. + +=back + +=back + +Example usage: + my $req = FCGI::Request; + +or: + my %env; + my $in = new IO::Handle; + my $out = new IO::Handle; + my $err = new IO::Handle; + my $req = FCGI::Request($in, $out, $err, \%env); + +=item FCGI::OpenSocket(path, backlog) + +=item FCGI::CloseSocket(socket) + +Close a socket opened with OpenSocket. + +=item $req->Accept() + +Accepts a connection on $req, attaching the filehandles and +populating the environment hash. +Returns 0 on success. If a connection has been accepted before, the old one will be finished first. -=item FCGI::finish() +Note that unlike with the old interface, no die and warn +handlers are installed by default. + +=item $req->Finish() Finishes accepted connection. +Also detaches filehandles. -=item FCGI::flush() +=item $req->Flush() Flushes accepted connection. -=item FCGI::set_exit_status(status) +=item $req->Detach() + +Temporarily detaches filehandles on an accepted connection. + +=item $req->Attach() + +Re-attaches filehandles on an accepted connection. + +=item $env = $req->GetEnvironment() + +Returns the environment parameter passed to FCGI::Request. + +=item ($in, $out, $err) = $req->GetHandles() -Sets the exit status that finish returns to the server. +Returns the file handle parameters passed to FCGI::Request. -=item FCGI::start_filter_data() +=item $isfcgi = $req->IsFastCGI() -Does anyone use this function ? +Returns whether or not the program was run as a FastCGI. =back