# A very very simple HTTP server that initializes a CGI environment
sub run {
- my ( $self, $class, $port, $host, $fork ) = @_;
+ my ( $self, $class, $port, $host, $options ) = @_;
+ $options ||= {};
+
our $GOT_HUP;
local $GOT_HUP = 0;
-
+
local $SIG{HUP} = sub { $GOT_HUP = 1; };
-
local $SIG{CHLD} = 'IGNORE';
# Handle requests
# Setup socket
$host = $host ? inet_aton($host) : INADDR_ANY;
- socket( HTTPDaemon, PF_INET, SOCK_STREAM, getprotobyname('tcp') );
- setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) );
- bind( HTTPDaemon, sockaddr_in( $port, $host ) );
- listen( HTTPDaemon, SOMAXCONN );
+ socket( HTTPDaemon, PF_INET, SOCK_STREAM, getprotobyname('tcp') )
+ || die "Couldn't assign TCP socket: $!";
+ setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) )
+ || die "Couldn't set TCP socket options: $!";
+ bind( HTTPDaemon, sockaddr_in( $port, $host ) )
+ || die "Couldn't bind socket to $port on $host: $!";
+ listen( HTTPDaemon, SOMAXCONN )
+ || die "Couldn't listen to socket on $port on $host: $!";
my $url = 'http://';
if ( $host eq INADDR_ANY ) {
require Sys::Hostname;
while ( accept( Remote, HTTPDaemon ) ) {
# Fork
- if ($fork) { next if $pid = fork }
+ if ( $options->{fork} ) { next if $pid = fork }
close HTTPDaemon if defined $pid;
close Remote;
}
close HTTPDaemon;
- exec {$0}( ( ( -x $0 ) ? () : ($^X) ), $0, @ARGV ) if $GOT_HUP;
+
+ if ($GOT_HUP) {
+ $SIG{CHLD} = 'DEFAULT';
+ wait;
+ exec $^X . ' "' . $0 . '" ' . join(' ', @{$options->{argv}});
+ }
}
sub _get_line {