X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=f7a13eae224ff4aa8cac62230843728295d426ba;hb=c46dd4e827ae611b4e5047d236507a4470bf43a5;hp=fd11fc953aacca7af2e4c6330e2bdf1b053e3d45;hpb=0fc2d522eec43202c21e9f0062e43f10db4d9008;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index fd11fc9..f7a13ea 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -1,9 +1,7 @@ package Catalyst::Engine::HTTP; -use Class::C3; use Moose; extends 'Catalyst::Engine::CGI'; -no Moose; use Data::Dump qw(dump); use Errno 'EWOULDBLOCK'; @@ -21,6 +19,16 @@ require Catalyst::Engine::HTTP::Restarter::Watcher; use constant CHUNKSIZE => 64 * 1024; use constant DEBUG => $ENV{CATALYST_HTTP_DEBUG} || 0; +has options => ( is => 'rw' ); +has _keepalive => ( is => 'rw', predicate => '_is_keepalive', clearer => '_clear_keepalive' ); +has _write_error => ( is => 'rw', predicate => '_has_write_error' ); + +use namespace::clean -except => [qw/meta/]; + +# Refactoring note - could/should Eliminate all instances of $self->{inputbuf}, +# which I haven't touched as it is used as an lvalue in a lot of places, and I guess +# doing it differently could be expensive.. Feel free to refactor and NYTProf :) + =head1 NAME Catalyst::Engine::HTTP - Catalyst HTTP Engine @@ -64,12 +72,12 @@ sub finalize_headers { # Should we keep the connection open? my $connection = $c->request->header('Connection'); - if ( $self->{options}->{keepalive} + if ( $self->options->{keepalive} && $connection && $connection =~ /^keep-alive$/i ) { $res_headers->header( Connection => 'keep-alive' ); - $self->{_keepalive} = 1; + $self->_keepalive(1); } else { $res_headers->header( Connection => 'close' ); @@ -79,29 +87,27 @@ sub finalize_headers { # Buffer the headers so they are sent with the first write() call # This reduces the number of TCP packets we are sending - $self->{_header_buf} = join("\x0D\x0A", @headers, ''); + $self->_header_buf( join("\x0D\x0A", @headers, '') ); } =head2 $self->finalize_read($c) =cut -sub finalize_read { +before finalize_read => sub { # Never ever remove this, it would result in random length output # streams if STDIN eq STDOUT (like in the HTTP engine) *STDIN->blocking(1); - shift->next::method(@_); -} +}; =head2 $self->prepare_read($c) =cut -sub prepare_read { +before prepare_read => sub { # Set the input handle to non-blocking *STDIN->blocking(0); - shift->next::method(@_); -} +}; =head2 $self->read_chunk($c, $buffer, $length) @@ -143,21 +149,22 @@ Writes the buffer to the client. =cut -sub write { +around write => sub { + my $orig = shift; my ( $self, $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 ( $self->_has_header_buf ) { + $buffer = $self->_clear_header_buf . $buffer; } - my $ret = $self->next::method($c, $buffer); + my $ret = $self->$orig($c, $buffer); if ( !defined $ret ) { - $self->{_write_error} = $!; + $self->_write_error($!); DEBUG && warn "write: Failed to write response ($!)\n"; } else { @@ -165,7 +172,7 @@ sub write { } return $ret; -} +}; =head2 run @@ -177,7 +184,7 @@ sub run { $options ||= {}; - $self->{options} = $options; + $self->options($options); if ($options->{background}) { my $child = fork; @@ -281,7 +288,7 @@ sub run { $self->_handler( $class, $port, $method, $uri, $protocol ); - if ( my $error = delete $self->{_write_error} ) { + if ( $self->_has_write_error ) { close Remote; if ( !defined $pid ) { @@ -360,7 +367,6 @@ sub _handler { 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, @@ -380,7 +386,8 @@ sub _handler { # Allow keepalive requests, this is a hack but we'll support it until # the next major release. - if ( delete $self->{_keepalive} ) { + if ( $self->_is_keepalive ) { + $self->_clear_keepalive; DEBUG && warn "Reusing previous connection for keep-alive request\n"; @@ -511,9 +518,6 @@ sub _socket_data { # This mess is necessary to keep IE from crashing the server my $data = { - peername => $iaddr - ? ( gethostbyaddr( $iaddr, AF_INET ) || 'localhost' ) - : 'localhost', peeraddr => $iaddr ? ( inet_ntoa($iaddr) || '127.0.0.1' ) : '127.0.0.1', @@ -526,19 +530,20 @@ sub _socket_data { sub _inet_addr { unpack "N*", inet_aton( $_[0] ) } -=head1 SEE ALSO +no Moose; -L, L. +=head2 options -=head1 AUTHORS +Options hash passed to the http engine to control things like if keepalive +is supported. -Sebastian Riedel, +=head1 SEE ALSO -Dan Kubb, +L, L -Sascha Kiefer, +=head1 AUTHORS -Andy Grundman, +Catalyst Contributors, see Catalyst.pm =head1 THANKS