use strict;
use warnings FATAL => 'all';

use Apache::Test;
use Apache::TestUtil;
use Apache::TestRequest ();

my @test_strings = ("",
                    "0",
                    "0000000000000000000000000000000000",
                    "1000000000000000000000000000000000",
                    "-1",
                    "123abc",
                    );
my @req_strings =  ("/echo_post",
                    "/i_do_not_exist_in_your_wildest_imagination");

my $resp_failure;
if (have_min_apache_version('2.2.30')
    && (!have_min_apache_version('2.3.0')
        || have_min_apache_version('2.4.14'))) {
    $resp_failure = "HTTP/1.1 400 Bad Request";
}
else {
    $resp_failure = "HTTP/1.1 413 Request Entity Too Large";
}
# This is expanded out.
my @resp_strings = ($resp_failure,
                    $resp_failure,
                    "HTTP/1.1 200 OK",
                    "HTTP/1.1 404 Not Found",
                    "HTTP/1.1 200 OK",
                    "HTTP/1.1 404 Not Found",
                    $resp_failure,
                    $resp_failure,
                    $resp_failure,
                    $resp_failure,
                    $resp_failure,
                    $resp_failure,
                   );

my $tests = 4 * @test_strings;
my $vars = Apache::Test::vars();
my $module = 'default';
my $cycle = 0;

plan tests => $tests, ['eat_post'];

print "testing $module\n";

for my $data (@test_strings) {
  for my $request_uri (@req_strings) {
    my $sock = Apache::TestRequest::vhost_socket($module);
    ok $sock;

    Apache::TestRequest::socket_trace($sock);

    $sock->print("POST $request_uri HTTP/1.0\r\n");
    $sock->print("Content-Length: $data\r\n");
    $sock->print("\r\n");
    $sock->print("\r\n");

    # Read the status line
    chomp(my $response = Apache::TestRequest::getline($sock) || '');
    $response =~ s/\s$//;

    # Tests with empty content-length have platform-specific behaviour
    # until 2.1.0.
    skip 
      $data eq "" && !have_min_apache_version('2.1.0') ? 
         "skipping tests with empty C-L for httpd < 2.1.0" : 0,
      t_cmp($response, $resp_strings[$cycle],
             "response codes POST for $request_uri with Content-Length: $data");

    $cycle++;

    do {
        chomp($response = Apache::TestRequest::getline($sock) || '');
        $response =~ s/\s$//;
    }
    while ($response ne "");
  }
}