| use strict; |
| use warnings FATAL => 'all'; |
| |
| use Apache::Test; |
| use Apache::TestUtil; |
| use Apache::TestRequest (); |
| |
| my @test_strings = ("0", |
| "A\r\n1234567890\r\n0", |
| "A; ext=val\r\n1234567890\r\n0", |
| "A \r\n1234567890\r\n0", # <10 BWS |
| "A :: :: :: \r\n1234567890\r\n0", # <10 BWS multiple send |
| "A \r\n1234567890\r\n0", # >10 BWS |
| "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r\n", |
| "A; ext=\x7Fval\r\n1234567890\r\n0", |
| " A", |
| ); |
| my @req_strings = ("/echo_post_chunk", |
| "/i_do_not_exist_in_your_wildest_imagination"); |
| |
| # This is expanded out as these results... |
| my @resp_strings = ("HTTP/1.1 200 OK", # "0" |
| "HTTP/1.1 404 Not Found", |
| "HTTP/1.1 200 OK", # "A" |
| "HTTP/1.1 404 Not Found", |
| "HTTP/1.1 200 OK", # "A; ext=val" |
| "HTTP/1.1 404 Not Found", |
| "HTTP/1.1 200 OK", # "A " |
| "HTTP/1.1 404 Not Found", |
| "HTTP/1.1 200 OK", # "A " + " " + " " + " " pkts |
| "HTTP/1.1 404 Not Found", |
| "HTTP/1.1 400 Bad Request", # >10 BWS |
| "HTTP/1.1 400 Bad Request", |
| "HTTP/1.1 413 Request Entity Too Large", # Overflow size |
| "HTTP/1.1 413 Request Entity Too Large", |
| "HTTP/1.1 400 Bad Request", # Ctrl in data |
| "HTTP/1.1 400 Bad Request", |
| "HTTP/1.1 400 Bad Request", # Invalid LWS |
| "HTTP/1.1 400 Bad Request", |
| ); |
| |
| my $tests = 4 * @test_strings + 1; |
| my $vars = Apache::Test::vars(); |
| my $module = 'default'; |
| my $cycle = 0; |
| |
| plan tests => $tests, ['echo_post_chunk']; |
| |
| 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); |
| |
| my @elts = split("::", $data); |
| |
| $sock->print("POST $request_uri HTTP/1.0\r\n"); |
| $sock->print("Transfer-Encoding: chunked\r\n"); |
| $sock->print("\r\n"); |
| if (@elts > 1) { |
| for my $elt (@elts) { |
| $sock->print("$elt"); |
| sleep 0.5; |
| } |
| $sock->print("\r\n"); |
| } |
| else { |
| $sock->print("$data\r\n"); |
| } |
| $sock->print("X-Chunk-Trailer: $$\r\n"); |
| $sock->print("\r\n"); |
| |
| #Read the status line |
| chomp(my $response = Apache::TestRequest::getline($sock)); |
| $response =~ s/\s$//; |
| ok t_cmp($response, $resp_strings[$cycle++], "response codes"); |
| |
| do { |
| chomp($response = Apache::TestRequest::getline($sock)); |
| $response =~ s/\s$//; |
| } |
| while ($response ne ""); |
| |
| if ($cycle == 1) { |
| $response = Apache::TestRequest::getline($sock); |
| chomp($response) if (defined($response)); |
| ok t_cmp($response, "$$", "trailer (pid)"); |
| } |
| } |
| } |