1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
package t::Slowloris;
use strict;
use warnings;
package Slowloris;
use Test::SharedFork;
our $WriteBytes = 1;
our $SleepBeforeWrite = 0;
our $SleepBeforeRead = 0;
package Slowloris::Socket;
use parent qw(IO::Socket::INET);
use Time::HiRes qw(sleep);
sub syswrite {
my($sock, $buff, $len, $off) = @_;
sleep $SleepBeforeWrite if $SleepBeforeWrite;
my $w = $off;
while($off < $len) {
my $n = $sock->SUPER::syswrite($buff, $Slowloris::WriteBytes, $off);
defined($n) or return undef;
$off += $n;
}
return $off - $w;
}
sub sysread {
my $sock = shift;
sleep $SleepBeforeRead if $SleepBeforeRead;
return $sock->SUPER::sysread(@_);
}
package Slowloris::Server;
use parent qw(HTTP::Server::PSGI);
sub setup_listener {
my $self = shift;
$self->SUPER::setup_listener(@_);
bless $self->{listen_sock}, 'Slowloris::Socket';
}
1;
|