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;