The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use strict;

use Net::Async::FastCGI;

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->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 = Net::Async::FastCGI->new(
   handle => \*STDIN,
   on_request => \&on_request,
);

$loop->add( $fcgi );

$loop->run;