Minor cleanup in H::Daemon
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Engine / HTTP / Daemon.pm
index 7d21a05..f8f87ed 100644 (file)
@@ -82,10 +82,11 @@ sub run {
 
     while (1) {
 
-        for my $client ( $select->can_read(0.1) ) {
+        for my $client ( $select->can_read(1) ) {
 
             if ( $client == $daemon ) {
                 $client = $daemon->accept;
+                $client->timestamp = time;
                 $client->blocking(0);
                 $select->add($client);
             }
@@ -94,9 +95,9 @@ sub run {
                 next if $client->request;
                 next if $client->response;
 
-                my $read = $client->sysread( my $buf, 4096 );
+                my $nread = $client->sysread( my $buf, 4096 );
 
-                unless ( defined($read) && length($buf) ) {
+                unless ( defined($nread) && length($buf) ) {
 
                     $select->remove($client);
                     $client->close;
@@ -105,22 +106,36 @@ 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 );
         }
 
-        for my $client ( $select->can_write(0) ) {
+        for my $client ( $select->can_write(1) ) {
 
             next unless $client->response;
 
@@ -129,13 +144,11 @@ sub run {
                 $client->response_offset = 0;
             }
 
-            my $write = $client->syswrite( $client->response_buffer,
-                                           $client->response_length,
-                                           $client->response_offset );
-
-            $client->response_offset += $write;
+            my $nwrite = $client->syswrite( $client->response_buffer,
+                                            $client->response_length,
+                                            $client->response_offset );
 
-            unless ( defined($write) ) {
+            unless ( defined($nwrite) ) {
 
                 $select->remove($client);
                 $client->close;
@@ -143,6 +156,8 @@ sub run {
                 next;
             }
 
+            $client->response_offset += $nwrite;
+
             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;