tabs => spaces
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / HTTP.pm
index 6df5345..497ab90 100644 (file)
@@ -149,15 +149,15 @@ Writes the buffer to the client. Can only be called once for a request.
 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 );
+    # 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";
@@ -276,17 +276,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 +315,6 @@ sub run {
                     last;
                 }
             }
-
-            exit if defined $pid;
         }
         continue {
             close Remote;
@@ -346,19 +357,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         || '',