-# $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;
);
-$VERSION = '0.47';
+$VERSION = '0.56';
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));
return $rc;
}
-sub finish(;$) {
- return Finish(@_) if @_ == 1;
-
+sub finish() {
%ENV = %FCGI::ENV if (defined %FCGI::ENV);
# not SFIO
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;
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
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);
}
=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