From: Kieren Diment Date: Wed, 4 Apr 2007 00:43:37 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 5.7099_04~194 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=1661e231e145cda7f7d7b7cadbc2481522e02439 --- diff --git a/Changes b/Changes index c547f97..0dedc80 100644 --- a/Changes +++ b/Changes @@ -14,6 +14,7 @@ This file documents the revision history for Perl extension Catalyst. 5.7007 2007-03-13 14:18:00 - Performance and stability improvements to the built-in HTTP server. + - Built-in server no longer supports -k (keep-alive). - Don't ignore file uploads if form contains a text field with the same name. (Carl Franks) - Support restart_delay of 0 (for use in the POE engine). diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index 6df5345..4062d33 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -57,21 +57,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 @@ -259,12 +247,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 ( !$self->_read_headers ) { - # Error reading, give up - next LISTEN; + if ( !$read ) { + DEBUG && warn "EOF or error: $!\n"; + 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; @@ -359,81 +355,36 @@ sub _handler { %copy_of_env, ); - # 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, - ); + # 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; - } + # Parse headers + if ( $protocol >= 1 ) { + $self->_parse_headers; + } - # Pass flow control to Catalyst - $class->handle_request; - - DEBUG && warn "Request done\n"; + # Pass flow control to Catalyst + $class->handle_request; - # 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; - } - - ( $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; - } + DEBUG && warn "Request done\n"; - DEBUG && warn "Closing connection\n"; + # 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 _read_headers { - my $self = shift; - - while (1) { - my $read = sysread Remote, my $buf, CHUNKSIZE; - - if ( !$read ) { - DEBUG && warn "EOF or error: $!\n"; - return; - } - - DEBUG && warn "Read $read bytes\n"; - $self->{inputbuf} .= $buf; - last if $self->{inputbuf} =~ /(\x0D\x0A?\x0D\x0A?|\x0A\x0D?\x0A\x0D?)/s; - } - - return 1; -} - sub _parse_request_line { my $self = shift;