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);
}
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;
}
$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;
$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;
next;
}
+ $client->response_offset += $nwrite;
+
if ( $client->response_offset == $client->response_length ) {
my $connection = $client->request->header('Connection');
${*$self}{'httpd_woffset'};
}
+sub timestamp : lvalue {
+ my $self = shift;
+ ${*$self}{'timestamp'};
+}
1;