use base 'Catalyst::Engine::HTTP::Base';
use IO::Select;
+use IO::Socket;
+
+BEGIN {
+
+ if ( $^O eq 'MSWin32' ) {
+
+ *EINPROGRESS = sub { 10036 };
+ *EWOULDBLOCK = sub { 10035 };
+ *F_GETFL = sub { 0 };
+ *F_SETFL = sub { 0 };
+
+ *IO::Socket::blocking = sub {
+ my ( $self, $blocking ) = @_;
+ my $nonblocking = $blocking ? 0 : 1;
+ ioctl( $self, 0x8004667e, \$nonblocking );
+ };
+ }
+
+ else {
+ Errno->require;
+ Errno->import( qw[EWOULDBLOCK EINPROGRESS] );
+ }
+}
=head1 NAME
$SIG{'PIPE'} = 'IGNORE';
my $daemon = Catalyst::Engine::HTTP::Daemon::Catalyst->new(
- Listen => 1,
+ Listen => SOMAXCONN,
LocalPort => $port,
ReuseAddr => 1,
Timeout => 5
while (1) {
- for my $client ( $select->can_read(0.01) ) {
+ for my $client ( $select->can_read(1) ) {
if ( $client == $daemon ) {
$client = $daemon->accept;
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;
$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 );
+ 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 += $write;
+ $client->response_offset += $nwrite;
if ( $client->response_offset == $client->response_length ) {