X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FHTTP.pm;h=37ed3a95d1e4eaf7863f1a494c4c22e278792adf;hb=5303e1782e6a92d80eee93c79d2907dd55a01821;hp=e056ffff1d2380ca3652fc7d928f0d0c244ef717;hpb=bd357f391bf8e0df526773dc2555127f1cc9e331;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/HTTP.pm b/lib/Catalyst/Engine/HTTP.pm index e056fff..37ed3a9 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; @@ -119,63 +116,20 @@ sub run { 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; - } - } - } - } + my $allowed = $options->{allowed} || { '127.0.0.1' => '255.255.255.255' }; # Handle requests # Setup socket $host = $host ? inet_aton($host) : INADDR_ANY; socket( HTTPDaemon, PF_INET, SOCK_STREAM, getprotobyname('tcp') ) - || die "Couldn't assign TCP socket: $!"; + || die "Couldn't assign TCP socket: $!"; setsockopt( HTTPDaemon, SOL_SOCKET, SO_REUSEADDR, pack( "l", 1 ) ) - || die "Couldn't set TCP socket options: $!"; + || die "Couldn't set TCP socket options: $!"; bind( HTTPDaemon, sockaddr_in( $port, $host ) ) - || die "Couldn't bind socket to $port on $host: $!"; + || die "Couldn't bind socket to $port on $host: $!"; listen( HTTPDaemon, SOMAXCONN ) - || die "Couldn't listen to socket on $port on $host: $!"; + || die "Couldn't listen to socket on $port on $host: $!"; my $url = 'http://'; if ( $host eq INADDR_ANY ) { require Sys::Hostname; @@ -261,9 +215,22 @@ sub run { } } } + unless ( uc($method) eq 'KILL' ) { - # Pass flow control to Catalyst - $class->handle_request; + # Pass flow control to Catalyst + $class->handle_request; + } + else { + my $ipaddr = _inet_addr($peeraddr); + my $ready = 0; + while ( my ( $ip, $mask ) = each %$allowed and not $ready ) { + $ready = ( $ipaddr & _inet_addr($mask) ) == _inet_addr($ip); + } + if ($ready) { + $GOT_HUP = 1; + last; + } + } exit if defined $pid; } continue { @@ -274,22 +241,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 { @@ -307,36 +260,7 @@ 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; -} +sub _inet_addr { unpack "N*", inet_aton( $_[0] ) } =back