Added timeout to C::E::H::Daemon
Christian Hansen [Mon, 30 May 2005 01:41:31 +0000 (01:41 +0000)]
lib/Catalyst/Engine/HTTP/Daemon.pm

index 7d21a05..7903d3d 100644 (file)
@@ -82,10 +82,11 @@ sub run {
 
     while (1) {
 
-        for my $client ( $select->can_read(0.1) ) {
+        for my $client ( $select->can_read(0.01) ) {
 
             if ( $client == $daemon ) {
                 $client = $daemon->accept;
+                $client->timestamp = time;
                 $client->blocking(0);
                 $select->add($client);
             }
@@ -105,18 +106,32 @@ sub run {
                 }
 
                 $client->request_buffer .= $buf;
-                $client->request = $client->get_request;
+
+                if ( my $request = $client->get_request ) {
+                    $client->request   = $request;
+                    $client->timestamp = time
+                }
             }
         }
 
         for my $client ( $select->handles ) {
 
             next if $client == $daemon;
+
+            if ( ( time - $client->timestamp ) > 60 ) {
+
+                $select->remove($client);
+                $client->close;
+
+                next;
+            }
+
             next if $client->response;
             next unless $client->request;
 
             $client->response = HTTP::Response->new;
             $client->response->protocol( $client->request->protocol );
+
             $class->handler( $client->request, $client->response, $client );
         }
 
@@ -133,8 +148,6 @@ sub run {
                                            $client->response_length,
                                            $client->response_offset );
 
-            $client->response_offset += $write;
-
             unless ( defined($write) ) {
 
                 $select->remove($client);
@@ -143,6 +156,8 @@ sub run {
                 next;
             }
 
+            $client->response_offset += $write;
+
             if ( $client->response_offset == $client->response_length ) {
 
                 my $connection = $client->request->header('Connection');
@@ -227,5 +242,9 @@ sub response_offset : lvalue {
     ${*$self}{'httpd_woffset'};
 }
 
+sub timestamp : lvalue {
+    my $self = shift;
+    ${*$self}{'timestamp'};
+}
 
 1;