package RWDE::Web::FCGIadapter;
use strict;
use warnings;
use CGI;
use FCGI;
use Error qw(:try);
use RWDE::Exceptions;
use base qw(CGI RWDE::Web::CGIadapter);
our($Ext_Request);
# workaround for known bug in libfcgi
while ((my $ignore) = each %ENV) { }
# New calls FCGI's accept() method.
sub new {
my ($proto, $params) = @_;
my $class = ref($proto) || $proto;
if ($Ext_Request) {
return
unless $Ext_Request->Accept() >= 0;
} else {
return
unless FCGI::accept() >= 0;
}
CGI->_reset_globals;
my $self = { req => $CGI::Q = $class->SUPER::new($params) };
bless $self, $class;
return $self;
}
# override the initialization behavior so that
# state is NOT maintained between invocations
sub save_request {
# no-op
}
sub run {
my ($self, $params) = @_;
# it should fork here and enter the blocking while loop
# for the child only, the parent should make note who
# got deployed listening to which port and continue monitoring
while (my $req = $self->new()) {
try{
RWDE::Web::CommandProxy->execute({ req => $req });
}
catch Error with{
my $ex = shift;
$self->syslog_msg('info', "dispatch caught: $ex");
$self->syslog_msg('info', "This is beyond unusual, exceptions are caught here to avoid server going down");
}
}
return();
}
1;