-# $Id: FCGI.pm,v 1.11 2000/10/08 19:48:23 skimo Exp $
-
package FCGI;
+use strict;
-require Exporter;
-require DynaLoader;
-
-@ISA = qw(Exporter DynaLoader);
-# Items to export into callers namespace by default. Note: do not export
-# names by default without a very good reason. Use EXPORT_OK instead.
-# Do not simply export all your public functions/methods/constants.
-@EXPORT = qw(
-
-);
-
-$VERSION = '0.54';
-
-bootstrap FCGI;
-
-# Preloaded methods go here.
-
-# Autoload methods go after __END__, and are processed by the autosplit program.
-
-*FAIL_ACCEPT_ON_INTR = sub() { 1 };
-
-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);
- 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() {
- %ENV = %FCGI::ENV if (defined %FCGI::ENV);
-
- # not SFIO
- if (tied (*STDIN)) {
- for (qw(__WARN__ __DIE__)) {
- delete $SIG{$_} if ($SIG{$_} == $warn_die_handler);
- }
- }
-
- Finish ($global_request);
-}
-
-sub flush() {
- Flush($global_request);
-}
-
-sub detach() {
- Detach($global_request);
-}
+BEGIN {
+ our $VERSION = '0.80';
-sub attach() {
- Attach($global_request);
+ require XSLoader;
+ XSLoader::load(__PACKAGE__, $VERSION);
}
-# deprecated
-sub set_exit_status {
-}
+sub FAIL_ACCEPT_ON_INTR () { 1 };
-sub start_filter_data() {
- StartFilterData($global_request);
+sub Request(;***$*$) {
+ my @defaults = (\*STDIN, \*STDOUT, \*STDERR, \%ENV, 0, FAIL_ACCEPT_ON_INTR);
+ $_[4] = fileno($_[4]) if defined($_[4]) && defined(fileno($_[4]));
+ splice @defaults,0,@_,@_;
+ &RequestX(@defaults);
}
-$global_request = Request();
-$warn_die_handler = sub { print STDERR @_ unless $^S };
-
package FCGI::Stream;
+use strict;
sub PRINTF {
shift->PRINT(sprintf(shift, @_));
}
+sub BINMODE {
+}
+
sub READLINE {
my $stream = shift;
my ($s, $c);
$c = $stream->GETC();
if ($/ eq '') {
- while ($c eq "\n") {
- $c = $stream->GETC();
- }
+ 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 .= $c;
+ last if $c eq $l and substr($s, -$len) eq $rs;
+ $c = $stream->GETC();
}
$s;
}
sub OPEN {
- $_[0]->CLOSE;
- @_ == 2 ? open($_[0], $_[1]) : open($_[0], $_[1], $_[2]);
+ require Carp;
+ Carp::croak(q/Operation 'OPEN' not supported on FCGI::Stream handle/);
+}
+
+sub SEEK {
+ require Carp;
+ Carp::croak(q/Operation 'SEEK' not supported on FCGI::Stream handle/);
+}
+
+sub TELL {
+ require Carp;
+ Carp::croak(q/Operation 'TELL' not supported on FCGI::Stream handle/);
+}
+
+sub TIEHANDLE {
+ require Carp;
+ Carp::croak(q/Operation 'TIEHANDLE' not supported on FCGI::Stream handle/);
}
1;
my $count = 0;
my $request = FCGI::Request();
- while($request->accept() >= 0) {
- print("Content-type: text/html\r\n\r\n", ++$count);
+ while($request->Accept() >= 0) {
+ print("Content-type: text/html\r\n\r\n", ++$count);
}
=head1 DESCRIPTION
=item error perl file handle (default: \*STDERR)
These filehandles will be setup to act as input/output/error
-on succesful Accept.
+on successful Accept.
=item environment hash reference (default: \%ENV)
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)
+You should only use your own socket if your program
+is not started by a process manager such as mod_fastcgi
+(except for the FastCgiExternalServer case) or cgi-fcgi.
+If you use the option, you have to let your FastCGI
+server know which port (and possibly server) your program
+is listening on.
+See remote.pl for an example.
+
+=item flags (default: FCGI::FAIL_ACCEPT_ON_INTR)
Possible values:
=item FCGI::OpenSocket(path, backlog)
+Creates a socket suitable to use as an argument to Request.
+
+=over 8
+
+=item path
+
+Pathname of socket or colon followed by local tcp port.
+Note that some systems take file permissions into account
+on Unix domain sockets, so you'll have to make sure that
+the server can write to the created file, by changing
+the umask before the call and/or changing permissions and/or
+group of the file afterwards.
+
+=item backlog
+
+Maximum length of the queue of pending connections.
+If a connection
+request arrives with the queue full the client may receive
+an error with an indication of ECONNREFUSED.
+
+=back
+
=item FCGI::CloseSocket(socket)
Close a socket opened with OpenSocket.
one will be finished first.
Note that unlike with the old interface, no die and warn
-handlers are installed by default.
+handlers are installed by default. This means that if
+you are not running an sfio enabled perl, any warn or
+die message will not end up in the server's log by default.
+It is advised you set up die and warn handlers yourself.
+FCGI.pm contains an example of die and warn handlers.
=item $req->Finish()
Re-attaches filehandles on an accepted connection.
+=item $req->LastCall()
+
+Tells the library not to accept any more requests on this handle.
+It should be safe to call this method from signal handlers.
+
+Note that this method is still experimental and everything
+about it, including its name, is subject to change.
+
+=item $env = $req->GetEnvironment()
+
+Returns the environment parameter passed to FCGI::Request.
+
+=item ($in, $out, $err) = $req->GetHandles()
+
+Returns the file handle parameters passed to FCGI::Request.
+
+=item $isfcgi = $req->IsFastCGI()
+
+Returns whether or not the program was run as a FastCGI.
+
=back
+=head1 LIMITATIONS
+
+FCGI.pm isn't Unicode aware, only characters within the range 0x00-0xFF are
+supported. Attempts to output strings containing characters above 0xFF results
+in a exception: (F) C<Wide character in %s>.
+
+Users who wants the previous (FCGI.pm <= 0.68) incorrect behavior can disable the
+exception by using the C<bytes> pragma.
+
+ {
+ use bytes;
+ print "\x{263A}";
+ }
+
+
=head1 AUTHOR
Sven Verdoolaege <skimo@kotnet.org>
+=head1 COPYRIGHT AND LICENCE
+
+This software is copyrighted (c) 1996 by by Open Market, Inc.
+
+See the LICENSE file in this distribution for information on usage and
+redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+
=cut
__END__