use strict;
use warnings;
use Test::More;
+use Time::HiRes qw(gettimeofday tv_interval);
foreach my $mod (qw(Plack::Util Plack::Request Plack::Builder Danga::Socket
- HTTP::Parser::XS HTTP::Date HTTP::Status)) {
+ HTTP::Date HTTP::Status)) {
eval "require $mod";
plan skip_all => "$mod missing for httpd-corner.t" if $@;
}
like($head, qr/\b400\b/, 'got 400 response');
}
+{
+ my $conn = conn_for($sock, 'excessive body Content-Length');
+ $SIG{PIPE} = 'IGNORE';
+ my $n = (10 * 1024 * 1024) + 1;
+ $conn->write("PUT /sha1 HTTP/1.0\r\nContent-Length: $n\r\n\r\n");
+ ok($conn->read(my $buf, 8192), 'read response');
+ my ($head, $body) = split(/\r\n\r\n/, $buf);
+ like($head, qr/\b413\b/, 'got 413 response');
+}
+
+{
+ my $conn = conn_for($sock, 'excessive body chunked');
+ $SIG{PIPE} = 'IGNORE';
+ my $n = (10 * 1024 * 1024) + 1;
+ $conn->write("PUT /sha1 HTTP/1.1\r\nTransfer-Encoding: chunked\r\n");
+ $conn->write("\r\n".sprintf("%x\r\n", $n));
+ ok($conn->read(my $buf, 8192), 'read response');
+ my ($head, $body) = split(/\r\n\r\n/, $buf);
+ like($head, qr/\b413\b/, 'got 413 response');
+}
+
# Unix domain sockets
{
my $u = IO::Socket::UNIX->new(Type => SOCK_STREAM, Peer => $upath);
}
}
+{
+ my $conn = conn_for($sock, 'no TCP_CORK on empty body');
+ $conn->write("GET /empty HTTP/1.1\r\nHost:example.com\r\n\r\n");
+ my $buf = '';
+ my $t0 = [ gettimeofday ];
+ until ($buf =~ /\r\n\r\n/s) {
+ $conn->sysread($buf, 4096, length($buf));
+ }
+ my $elapsed = tv_interval($t0, [ gettimeofday ]);
+ ok($elapsed < 0.190, 'no 200ms TCP cork delay on empty body');
+}
+
{
my $conn = conn_for($sock, 'graceful termination during slow request');
$conn->write("PUT /sha1 HTTP/1.0\r\n");