X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=62481ea20bf65413527af5599055d055769b3274;hb=b354201608d428db344c63dd35de096a62a7a9d3;hp=d35e604872824371a7c6fe84b1398d6a62ff920f;hpb=025703186d05624d36984961c75a1e138eaed850;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index d35e604..62481ea 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -19,11 +19,15 @@ require Catalyst::Engine::HTTP::Restarter::Watcher; use constant CHUNKSIZE => 64 * 1024; use constant DEBUG => $ENV{CATALYST_HTTP_DEBUG} || 0; +use namespace::clean -except => 'meta'; + 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 @@ -179,7 +183,7 @@ sub run { my ( $self, $class, $port, $host, $options ) = @_; $options ||= {}; - + $self->options($options); if ($options->{background}) { @@ -212,7 +216,9 @@ sub run { ReuseAddr => 1, Type => SOCK_STREAM, ) - or die "Couldn't create daemon: $!"; + or die "Couldn't create daemon: $@"; + + $port = $daemon->sockport(); my $url = "http://$host"; $url .= ":$port" unless $port == 80; @@ -283,10 +289,10 @@ sub run { } $self->_handler( $class, $port, $method, $uri, $protocol ); - + if ( $self->_has_write_error ) { close Remote; - + if ( !defined $pid ) { next LISTEN; } @@ -318,9 +324,9 @@ sub run { close Remote; } } - + $daemon->close; - + DEBUG && warn "Shutting down\n"; if ($restart) { @@ -331,8 +337,8 @@ sub run { ### those include dirs upon re-exec. So add them to PERL5LIB, so they ### are available again for the exec'ed process --kane use Config; - $ENV{PERL5LIB} .= join $Config{path_sep}, @INC; - + $ENV{PERL5LIB} .= join $Config{path_sep}, @INC; + exec $^X, $0, @{ $options->{argv} }; } @@ -376,7 +382,14 @@ sub _handler { } # Pass flow control to Catalyst - $class->handle_request; + { + # FIXME: don't ignore SIGCHLD while handling requests so system() + # et al. work within actions. it might be a little risky to do that + # this far out, but then again it's only the dev server anyway. + local $SIG{CHLD} = 'DEFAULT'; + + $class->handle_request; + } DEBUG && warn "Request done\n"; @@ -441,7 +454,8 @@ sub _parse_request_line { my $self = shift; # Parse request line - if ( $self->{inputbuf} !~ s/^(\w+)[ \t]+(\S+)(?:[ \t]+(HTTP\/\d+\.\d+))?[^\012]*\012// ) { + # Leading CRLF sometimes sent by buggy IE versions + if ( $self->{inputbuf} !~ s/^(?:\x0D\x0A)?(\w+)[ \t]+(\S+)(?:[ \t]+(HTTP\/\d+\.\d+))?[^\012]*\012// ) { return (); } @@ -526,8 +540,6 @@ sub _socket_data { sub _inet_addr { unpack "N*", inet_aton( $_[0] ) } -no Moose; - =head2 options Options hash passed to the http engine to control things like if keepalive