builder
=>
'CGI'
,
writer
=> {
response_line
=> 0,
'write'
=>
sub
{
my
(
$self
,
$buffer
) =
@_
;
*STDOUT
->
syswrite
(
$buffer
);
},
}
;
use
constant
RUNNING_IN_HELL
=> $^O eq
'MSWin32'
;
has
leave_umask
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 0,
);
has
keep_stderr
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 0,
);
has
nointr
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 0,
);
has
detach
=> (
is
=>
'ro'
,
isa
=>
'Bool'
,
default
=> 0,
);
has
manager
=> (
is
=>
'ro'
,
isa
=>
'Str'
,
default
=>
"FCGI::ProcManager"
,
);
has
nproc
=> (
is
=>
'ro'
,
isa
=>
'Int'
,
default
=> 1,
);
has
pidfile
=> (
is
=>
'ro'
,
isa
=>
'Str'
,
);
has
listen
=> (
is
=>
'ro'
,
isa
=>
'Str'
,
);
sub
run {
my
(
$self
, ) =
@_
;
my
$sock
= 0;
if
(
$self
->
listen
) {
my
$old_umask
=
umask
;
unless
(
$self
->leave_umask ) {
umask
(0);
}
$sock
= FCGI::OpenSocket(
$self
->
listen
, 100 )
or
die
"failed to open FastCGI socket; $!"
;
unless
(
$self
->leave_umask ) {
umask
(
$old_umask
);
}
}
elsif
( !RUNNING_IN_HELL ) {
-S STDIN
or
die
"STDIN is not a socket; specify a listen location"
;
}
my
%env
;
my
$error
= \
*STDERR
;
$error
= \
*STDOUT
if
$self
->keep_stderr;
my
$request
=
FCGI::Request( \
*STDIN
, \
*STDOUT
,
$error
, \
%env
,
$sock
,
(
$self
->nointr ? 0 :
&FCGI::FAIL_ACCEPT_ON_INTR
),
);
my
$proc_manager
;
if
(
$self
->
listen
) {
$self
->daemon_fork()
if
$self
->detach;
if
(
$self
->manager ) {
Any::Moose::load_class(
$self
->manager);
$proc_manager
=
$self
->manager->new(
{
n_processes
=>
$self
->nproc,
pid_fname
=>
$self
->pidfile,
}
);
$self
->daemon_detach()
if
$self
->detach;
$proc_manager
->pm_manage();
}
elsif
(
$self
->detach ) {
$self
->daemon_detach();
}
}
while
(
$request
->Accept >= 0 ) {
$proc_manager
&&
$proc_manager
->pm_pre_dispatch();
if
(
$env
{SERVER_SOFTWARE} &&
$env
{SERVER_SOFTWARE} =~ /lighttpd/ ) {
$env
{PATH_INFO} ||=
delete
$env
{SCRIPT_NAME};
}
$self
->handle_request(
_connection
=> {
input_handle
=>
*STDIN
,
output_handle
=>
*STDOUT
,
env
=> \
%env
,
},
);
$proc_manager
&&
$proc_manager
->pm_post_dispatch();
}
}
sub
daemon_fork {
fork
&&
exit
;
}
sub
daemon_detach {
my
$self
=
shift
;
print
"FastCGI daemon started (pid $$)\n"
;
open
STDIN,
"+</dev/null"
or
die
$!;
open
STDOUT,
">&STDIN"
or
die
$!;
open
STDERR,
">&STDIN"
or
die
$!;
POSIX::setsid();
}
__INTERFACE__