1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
#!/usr/bin/perl -w
use strict;
use FCGI::Async;
use IO::Async::Stream;
use IO::Async::Loop;
my $loop = IO::Async::Loop->new();
sub on_request
{
my ( $fcgi, $req ) = @_;
my %req_env = %{ $req->params };
# Determine these however you like; perhaps examine $req
my $handler = "./sample.cgi";
my @handler_args = ();
my $stdin = "";
while( defined( my $line = $req->read_stdin_line ) ) {
$stdin .= $line;
}
$fcgi->get_loop->open_child(
command => [ $handler, @handler_args ],
setup => [
env => \%req_env,
],
stdin => {
from => $stdin,
},
stdout => {
on_read => sub {
my ( undef, $buffref ) = @_;
$req->print_stdout( $$buffref );
$$buffref = "";
return 0;
},
},
stderr => {
on_read => sub {
my ( undef, $buffref ) = @_;
$req->print_stderr( $$buffref );
$$buffref = "";
return 0;
},
},
on_finish => sub {
my ( undef, $exitcode ) = @_;
$req->finish( $exitcode );
},
);
}
my $fcgi = FCGI::Async->new(
handle => \*STDIN,
loop => $loop,
on_request => \&on_request,
);
$loop->loop_forever();
|