r9710@zaphod (orig r6123): andyg | 2007-02-28 17:45:31 +1100
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / HTTP.pm
index 365249a..8eb4dc3 100644 (file)
@@ -58,21 +58,9 @@ sub finalize_headers {
     push @headers, "$protocol $status $message";
     
     $c->response->headers->header( Date => HTTP::Date::time2str(time) );
+    $c->response->headers->header( Connection => 'close' );
     $c->response->headers->header( Status => $status );
     
-    # Should we keep the connection open?
-    my $connection = $c->request->header('Connection');
-    if (   $self->{options}->{keepalive} 
-        && $connection 
-        && $connection =~ /^keep-alive$/i
-    ) {
-        $c->response->headers->header( Connection => 'keep-alive' );
-        $self->{_keepalive} = 1;
-    }
-    else {
-        $c->response->headers->header( Connection => 'close' );
-    }
-    
     push @headers, $c->response->headers->as_string("\x0D\x0A");
     
     # Buffer the headers so they are sent with the first write() call
@@ -254,12 +242,20 @@ sub run {
 
             Remote->blocking(1);
         
-            # Read until we see all headers
+            # Read until we see a newline
             $self->{inputbuf} = '';
+        
+            while (1) {
+                my $read = sysread Remote, my $buf, CHUNKSIZE;
+            
+                if ( !$read ) {
+                    DEBUG && warn "EOF or error: $!\n";
+                    next LISTEN;
+                }
             
-            if ( !$self->_read_headers ) {
-                # Error reading, give up
-                next LISTEN;
+                DEBUG && warn "Read $read bytes\n";
+                $self->{inputbuf} .= $buf;
+                last if $self->{inputbuf} =~ /(\x0D\x0A?|\x0A\x0D?)/s;
             }
 
             my ( $method, $uri, $protocol ) = $self->_parse_request_line;
@@ -341,82 +337,36 @@ sub _handler {
     $sel->add( \*STDIN );
     
     REQUEST:
-    while (1) {
-        my ( $path, $query_string ) = split /\?/, $uri, 2;
-
-        # 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,
-        );
-
-        # Parse headers
-        if ( $protocol >= 1 ) {
-            $self->_parse_headers;
-        }
-
-        # Pass flow control to Catalyst
-        $class->handle_request;
-    
-        DEBUG && warn "Request done\n";
-    
-        # Allow keepalive requests, this is a hack but we'll support it until
-        # the next major release.
-        if ( delete $self->{_keepalive} ) {
-            
-            DEBUG && warn "Reusing previous connection for keep-alive request\n";
-            
-            if ( $sel->can_read(1) ) {            
-                if ( !$self->_read_headers ) {
-                    # Error reading, give up
-                    last REQUEST;
-                }
+    my ( $path, $query_string ) = split /\?/, $uri, 2;
+
+    # 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,
+    );
 
-                ( $method, $uri, $protocol ) = $self->_parse_request_line;
-                
-                DEBUG && warn "Parsed request: $method $uri $protocol\n";
-                
-                # Force HTTP/1.0
-                $protocol = '1.0';
-                
-                next REQUEST;
-            }
-            
-            DEBUG && warn "No keep-alive request within 1 second\n";
-        }
-        
-        last REQUEST;
+    # Parse headers
+    if ( $protocol >= 1 ) {
+        $self->_parse_headers;
     }
-    
-    DEBUG && warn "Closing connection\n";
-
-    close Remote;
-}
 
-sub _read_headers {
-    my $self = shift;
-    
-    while (1) {
-        my $read = sysread Remote, my $buf, CHUNKSIZE;
-    
-        if ( !$read ) {
-            DEBUG && warn "EOF or error: $!\n";
-            return;
-        }
+    # Pass flow control to Catalyst
+    $class->handle_request;
     
-        DEBUG && warn "Read $read bytes\n";
-        $self->{inputbuf} .= $buf;
-        last if $self->{inputbuf} =~ /(\x0D\x0A?\x0D\x0A?|\x0A\x0D?\x0A\x0D?)/s;
-    }
+    DEBUG && warn "Request done\n";
     
-    return 1;
+    # XXX: We used to have a hack for keep-alive here but keep-alive
+    # has no place in a single-tasking server like this.  Use HTTP::POE
+    # if you want keep-alive.
+
+    close Remote;
 }
 
 sub _parse_request_line {