use Test::More;
use HTTP::Daemon::SSL;
use FindBin;
use strict;
use warnings;
use vars qw/$SSL_SERVER_PORT $SSL_SERVER_ADDR/;
eval "use Test::WWW::Mechanize;";
plan skip_all => "Test::WWW::Mechanize required for POST test" if $@;
eval "use Test::Builder;";
plan skip_all => "Test::Builder based Test::More version required for POST test" if $@;
require $FindBin::Bin . "/ssl_settings.req";
plan tests => 20;
# due to child, numbers will get out of order
Test::More->builder->use_numbers(0);
my $data66k = do { local $/; open my $f, $FindBin::Bin . "/post66k"; <$f> };
my $data67k = do { local $/; open my $f, $FindBin::Bin . "/post67k"; <$f> };
my $data500k = do { local $/; open my $f, $FindBin::Bin . "/post500k"; <$f> };
my $server = new HTTP::Daemon::SSL(
LocalAddr => $SSL_SERVER_ADDR,
Listen => 5,
Timeout => 30,
ReuseAddr => 1,
SSL_verify_mode => 0x00,
SSL_ca_file => "certs/test-ca.pem",
SSL_cert_file => "certs/server-cert.pem");
ok($server, "made test server");
$SSL_SERVER_PORT = $server->sockport;
ok($SSL_SERVER_PORT, "server init port=$SSL_SERVER_PORT");
ok(fileno($server), "server fileno");
unless (fork) {
close($server);
my $mech = Test::WWW::Mechanize->new();
$mech->post_ok(
"https://$SSL_SERVER_ADDR:$SSL_SERVER_PORT/",
{ data => 'foo' },
"posted small request",
);
$mech->post_ok(
"https://$SSL_SERVER_ADDR:$SSL_SERVER_PORT/",
{ data => $data66k },
"posted 66k request",
);
$mech->post_ok(
"https://$SSL_SERVER_ADDR:$SSL_SERVER_PORT/",
{ data => $data67k },
"posted 67k request",
);
$mech->post_ok(
"https://$SSL_SERVER_ADDR:$SSL_SERVER_PORT/",
{ data => $data500k },
"posted 500k request",
);
exit(0);
}
# sink first request
my $conn;
ok(($conn = $server->accept), "accepted first post");
my $r;
ok(($r = $conn->get_request), "got request object");
is($r->method, 'POST', "method is POST");
is($r->content, 'data=foo', 'content matches');
$conn->send_response("bar");
close $conn;
# sink second request
ok(($conn = $server->accept), "accepted second 66k post");
ok(($r = $conn->get_request), "got request object");
is($r->method, 'POST', "method is POST");
$conn->send_response("bar");
close $conn;
# sink third request
ok(($conn = $server->accept), "accepted third 67k post");
ok(($r = $conn->get_request), "got request object");
is($r->method, 'POST', "method is POST");
$conn->send_response("bar");
close $conn;
# sink fourth request
ok(($conn = $server->accept), "accepted third 500k post");
ok(($r = $conn->get_request), "got request object");
is($r->method, 'POST', "method is POST");
$conn->send_response("bar");
close $conn;
wait;
# count child tests
my $builder = Test::More->builder;
$builder->current_test( $builder->current_test + 4 );