X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=881bf278e6534039efb9a22f8b7179bd385b6a0b;hb=8b9d02987edc3e51c44c36aef698de78659a0c35;hp=f685a1ed93fb3bc1d806ab9dc84f8704a2d1d603;hpb=83a8fcacf68e1063b5382835f2f9beb93f4bfe87;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index f685a1e..881bf27 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -7,7 +7,7 @@ use HTTP::Status; use NEXT; use Socket; use IO::Socket::INET (); -use IO::Select (); +use IO::Select (); # For PAR require Catalyst::Engine::HTTP::Restarter; @@ -37,9 +37,7 @@ This is the Catalyst engine specialized for development and testing. =head1 METHODS -=over 4 - -=item $self->finalize_headers($c) +=head2 $self->finalize_headers($c) =cut @@ -55,7 +53,7 @@ sub finalize_headers { $self->NEXT::finalize_headers($c); } -=item $self->finalize_read($c) +=head2 $self->finalize_read($c) =cut @@ -69,7 +67,7 @@ sub finalize_read { return $self->NEXT::finalize_read($c); } -=item $self->prepare_read($c) +=head2 $self->prepare_read($c) =cut @@ -82,7 +80,7 @@ sub prepare_read { return $self->NEXT::prepare_read($c); } -=item $self->read_chunk($c, $buffer, $length) +=head2 $self->read_chunk($c, $buffer, $length) =cut @@ -108,7 +106,7 @@ sub read_chunk { } } -=item run +=head2 run =cut @@ -118,6 +116,12 @@ sub run { $options ||= {}; + if ($options->{background}) { + my $child = fork; + die "Can't fork: $!" unless defined($child); + exit if $child; + } + my $restart = 0; local $SIG{CHLD} = 'IGNORE'; @@ -149,9 +153,27 @@ sub run { print "You can connect to your server at $url\n"; + if ($options->{background}) { + open STDIN, "+&STDIN" or die $!; + open STDERR, ">&STDIN" or die $!; + if ( $^O !~ /MSWin32/ ) { + require POSIX; + POSIX::setsid() + or die "Can't start a new session: $!"; + } + } + + if (my $pidfile = $options->{pidfile}) { + if (! open PIDFILE, "> $pidfile") { + warn("Cannot open: $pidfile: $!"); + } + print PIDFILE "$$\n"; + close PIDFILE; + } + $self->_keep_alive( $options->{keepalive} || 0 ); - my $parent = $$; my $pid = undef; while ( accept( Remote, $daemon ) ) { # TODO: get while ( my $remote = $daemon->accept ) to work @@ -180,8 +202,10 @@ sub run { my $sockdata = $self->_socket_data( \*Remote ); my $ipaddr = _inet_addr( $sockdata->{peeraddr} ); my $ready = 0; - while ( my ( $ip, $mask ) = each %$allowed and not $ready ) { + foreach my $ip ( keys %$allowed ) { + my $mask = $allowed->{$ip}; $ready = ( $ipaddr & _inet_addr($mask) ) == _inet_addr($ip); + last if $ready; } if ($ready) { $restart = 1; @@ -199,6 +223,13 @@ sub run { if ($restart) { $SIG{CHLD} = 'DEFAULT'; wait; + + ### if the standalone server was invoked with perl -I .. we will loose + ### those include dirs upon re-exec. So add them to PERL5LIB, so they + ### are available again for the exec'ed process --kane + use Config; + $ENV{PERL5LIB} .= join $Config{path_sep}, @INC; + exec $^X . ' "' . $0 . '" ' . join( ' ', @{ $options->{argv} } ); } @@ -228,8 +259,8 @@ sub _handler { # Initialize CGI environment local %ENV = ( - PATH_INFO => $path || '', - QUERY_STRING => $query_string || '', + PATH_INFO => $path || '', + QUERY_STRING => $query_string || '', REMOTE_ADDR => $sockdata->{peeraddr}, REMOTE_HOST => $sockdata->{peername}, REQUEST_METHOD => $method || '', @@ -304,16 +335,23 @@ sub _parse_request_line { sub _socket_data { my ( $self, $handle ) = @_; - my $remote_sockaddr = getpeername($handle); - my ( undef, $iaddr ) = sockaddr_in($remote_sockaddr); - my $local_sockaddr = getsockname($handle); + my $iaddr; + + my $remote_sockaddr = getpeername($handle); + ( undef, $iaddr ) = sockaddr_in($remote_sockaddr); + my $local_sockaddr = getsockname($handle); my ( undef, $localiaddr ) = sockaddr_in($local_sockaddr); + # This mess is necessary to keep IE from crashing the server my $data = { - peername => gethostbyaddr( $iaddr, AF_INET ) || "localhost", - peeraddr => inet_ntoa($iaddr) || "127.0.0.1", - localname => gethostbyaddr( $localiaddr, AF_INET ) || "localhost", - localaddr => inet_ntoa($localiaddr) || "127.0.0.1", + peername => $iaddr + ? ( gethostbyaddr( $iaddr, AF_INET ) || 'localhost' ) + : 'localhost', + peeraddr => $iaddr + ? ( inet_ntoa($iaddr) || '127.0.0.1' ) + : '127.0.0.1', + localname => gethostbyaddr( $localiaddr, AF_INET ) || 'localhost', + localaddr => inet_ntoa($localiaddr) || '127.0.0.1', }; return $data; @@ -336,8 +374,6 @@ sub _get_line { sub _inet_addr { unpack "N*", inet_aton( $_[0] ) } -=back - =head1 SEE ALSO L, L.