X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=bacc6bed54cd058bd97d5de464ec2748485d8a24;hb=41e1a0b023245a05ab2399fc5be2aada8b948fcc;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..bacc6be 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -25,6 +25,10 @@ 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 @@ -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} }; } @@ -441,7 +447,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 (); }