X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=2a718c4177ca652d63896a587f353d7fc946d207;hb=44c6d25a7b66041252d88ea41f26631aeca30eef;hp=6df53450c15f60ed89ed346608432fd6c3be66a1;hpb=7f3c573653fa9589cde849547116ccd915c12a68;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index 6df5345..2a718c4 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -142,31 +142,29 @@ sub read_chunk { =head2 $self->write($c, $buffer) -Writes the buffer to the client. Can only be called once for a request. +Writes the buffer to the client. =cut sub write { my ( $self, $c, $buffer ) = @_; - # Avoid 'print() on closed filehandle Remote' warnings when using IE - return unless *STDOUT->opened(); - - my $ret; - - # Prepend the headers if they have not yet been sent - if ( my $headers = delete $self->{_header_buf} ) { - DEBUG && warn "write: Wrote headers and first chunk (" . length($headers . $buffer) . " bytes)\n"; - $ret = $self->NEXT::write( $c, $headers . $buffer ); - } - else { - DEBUG && warn "write: Wrote chunk (" . length($buffer) . " bytes)\n"; - $ret = $self->NEXT::write( $c, $buffer ); + # Avoid 'print() on closed filehandle Remote' warnings when using IE + return unless *STDOUT->opened(); + + # Prepend the headers if they have not yet been sent + if ( my $headers = delete $self->{_header_buf} ) { + $buffer = $headers . $buffer; } - if ( !$ret ) { + my $ret = $self->NEXT::write( $c, $buffer ); + + if ( !defined $ret ) { $self->{_write_error} = $!; } + else { + DEBUG && warn "write: Wrote response ($ret bytes)\n"; + } return $ret; } @@ -186,7 +184,7 @@ sub run { if ($options->{background}) { my $child = fork; die "Can't fork: $!" unless defined($child); - exit if $child; + return $child if $child; } my $restart = 0; @@ -276,17 +274,30 @@ sub run { unless ( uc($method) eq 'RESTART' ) { # Fork - if ( $options->{fork} ) { next if $pid = fork } + if ( $options->{fork} ) { + if ( $pid = fork ) { + DEBUG && warn "Forked child $pid\n"; + next; + } + } $self->_handler( $class, $port, $method, $uri, $protocol ); if ( my $error = delete $self->{_write_error} ) { DEBUG && warn "Write error: $error\n"; close Remote; - next LISTEN; + + if ( !defined $pid ) { + next LISTEN; + } } - $daemon->close if defined $pid; + if ( defined $pid ) { + # Child process, close connection and exit + DEBUG && warn "Child process exiting\n"; + $daemon->close; + exit; + } } else { my $sockdata = $self->_socket_data( \*Remote ); @@ -302,8 +313,6 @@ sub run { last; } } - - exit if defined $pid; } continue { close Remote; @@ -346,19 +355,9 @@ sub _handler { $sel->add( \*STDIN ); REQUEST: - # Initialize CGI environment - local %ENV = ( - PATH_INFO => $path || '', - QUERY_STRING => $query_string || '', - REMOTE_ADDR => $sockdata->{peeraddr}, - REMOTE_HOST => $sockdata->{peername}, - REQUEST_METHOD => $method || '', - SERVER_NAME => $sockdata->{localname}, - SERVER_PORT => $port, - SERVER_PROTOCOL => "HTTP/$protocol", - %copy_of_env, - ); - + while (1) { + my ( $path, $query_string ) = split /\?/, $uri, 2; + # Initialize CGI environment local %ENV = ( PATH_INFO => $path || '',