X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=779378cbb6099e11713ea1fdf570bddec9203367;hp=7adbcb04fe3db04039d2fe829853894c4e8b89ab;hb=c825a86ca867b6b804aa8636728c3d3702ac9f04;hpb=6844bc1caaad5e344a888d87d86b4e2e61afb154 diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index 7adbcb0..779378c 100644 --- a/lib/Catalyst/Engine/HTTP.pm +++ b/lib/Catalyst/Engine/HTTP.pm @@ -3,9 +3,6 @@ package Catalyst::Engine::HTTP; use strict; use base 'Catalyst::Engine::CGI'; use Errno 'EWOULDBLOCK'; -use FindBin; -use File::Find; -use File::Spec; use HTTP::Status; use NEXT; use Socket; @@ -111,65 +108,26 @@ sub read_chunk { sub run { my ( $self, $class, $port, $host, $options ) = @_; + $options ||= {}; + our $GOT_HUP; local $GOT_HUP = 0; - + local $SIG{HUP} = sub { $GOT_HUP = 1; }; local $SIG{CHLD} = 'IGNORE'; - # Setup restarter - my $restarter; - if ( $options->{restart} ) { - my $parent = $$; - unless ( $restarter = fork ) { - - # Prepare - close STDIN; - close STDOUT; - - # Index parent directory - my $dir = File::Spec->catdir( $FindBin::Bin, '..' ); - - my $regex = $options->{restart_regex}; - my $one = _index( $dir, $regex ); - RESTART: while (1) { - sleep $options->{restart_delay}; - my $two = _index( $dir, $regex ); - my $changes = _compare_index( $one, $two ); - if (@$changes) { - $one = $two; - - # Test modified pm's - for my $file (@$changes) { - next unless $file =~ /\.pm$/; - if ( my $error = _test($file) ) { - print STDERR - qq/File "$file" modified, not restarting\n\n/; - print STDERR '*' x 80, "\n"; - print STDERR $error; - print STDERR '*' x 80, "\n"; - next RESTART; - } - } - - # Restart - my $files = join ', ', @$changes; - print STDERR qq/File(s) "$files" modified, restarting\n\n/; - kill( 1, $parent ); - exit; - } - } - } - } - # Handle requests # Setup socket $host = $host ? inet_aton($host) : INADDR_ANY; - socket( HTTPDaemon, PF_INET, SOCK_STREAM, getprotobyname('tcp') ); - setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) ); - bind( HTTPDaemon, sockaddr_in( $port, $host ) ); - listen( HTTPDaemon, SOMAXCONN ); + socket( HTTPDaemon, PF_INET, SOCK_STREAM, getprotobyname('tcp') ) + || die "Couldn't assign TCP socket: $!"; + setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) ) + || die "Couldn't set TCP socket options: $!"; + bind( HTTPDaemon, sockaddr_in( $port, $host ) ) + || die "Couldn't bind socket to $port on $host: $!"; + listen( HTTPDaemon, SOMAXCONN ) + || die "Couldn't listen to socket on $port on $host: $!"; my $url = 'http://'; if ( $host eq INADDR_ANY ) { require Sys::Hostname; @@ -268,22 +226,8 @@ sub run { if ($GOT_HUP) { $SIG{CHLD} = 'DEFAULT'; wait; - exec {$0}( ( ( -x $0 ) ? () : ($^X) ), $0, @{ $options->{argv} } ); - } -} - -sub _compare_index { - my ( $one, $two ) = @_; - my %clone = %$two; - my @changes; - while ( my ( $key, $val ) = each %$one ) { - if ( !$clone{$key} || ( $clone{$key} ne $val ) ) { - push @changes, $key; - } - delete $clone{$key}; + exec $^X . ' "' . $0 . '" ' . join(' ', @{$options->{argv}}); } - for my $key ( keys %clone ) { push @changes, $key } - return \@changes; } sub _get_line { @@ -301,37 +245,6 @@ sub _get_line { return $line; } -sub _index { - my ( $dir, $regex ) = @_; - my %index; - finddepth( - { - wanted => sub { - my $file = File::Spec->rel2abs($File::Find::name); - return unless $file =~ /$regex/; - return unless -f $file; - my $time = ( stat $file )[9]; - $index{$file} = $time; - }, - no_chdir => 1 - }, - $dir - ); - return \%index; -} - -sub _test { - my $file = shift; - delete $INC{$file}; - local $SIG{__WARN__} = sub { }; - open my $olderr, '>&STDERR'; - open STDERR, '>', File::Spec->devnull; - eval "require '$file'"; - open STDERR, '>&', $olderr; - return $@ if $@; - return 0; -} - =back =head1 SEE ALSO