# HG changeset patch # User Maxim Dounin # Date 1488392308 -10800 # Node ID b9d9c962255f7d70b42776949ed2250100a1bc20 # Parent baeebac35a2e5b22673994e7f069d5112f142d24 Tests: more large_client_header_buffers tests. diff --git a/http_header_buffers.t b/http_header_buffers.t --- a/http_header_buffers.t +++ b/http_header_buffers.t @@ -24,7 +24,7 @@ use Test::Nginx; select STDERR; $| = 1; select STDOUT; $| = 1; -my $t = Test::Nginx->new()->has(qw/http rewrite/)->plan(2) +my $t = Test::Nginx->new()->has(qw/http rewrite/)->plan(8) ->write_file_expand('nginx.conf', <<'EOF'); %%TEST_GLOBALS%% @@ -66,6 +66,17 @@ http { return 204; } + + server { + listen 127.0.0.1:8080; + server_name foo; + + large_client_header_buffers 5 256; + + add_header X-URI $uri; + add_header X-Foo $http_x_foo; + return 204; + } } EOF @@ -89,7 +100,8 @@ like(http( "X-Foo: " . ("1234567890" x 20) . CRLF . "X-Foo: " . ("1234567890" x 20) . CRLF . "X-Foo: " . ("1234567890" x 20) . CRLF . - "X-Foo: " . ("1234567890" x 20) . CRLF . CRLF + "X-Foo: " . ("1234567890" x 20) . CRLF . + CRLF ), qr/204|400/, 'additional buffers in virtual server'); # for pipelined requests large header buffers are saved to hc->free; @@ -104,12 +116,84 @@ like(http( "X-Foo: " . ("1234567890" x 20) . CRLF . "X-Foo: " . ("1234567890" x 20) . CRLF . "X-Foo: " . ("1234567890" x 20) . CRLF . - "Host: one" . CRLF . CRLF . + "Host: one" . CRLF . + CRLF . "GET / HTTP/1.1" . CRLF . "Host: one" . CRLF . - "Connection: close" . CRLF . CRLF + "Connection: close" . CRLF . + CRLF ), qr/204/, 'pipelined with too many buffers'); } +# check if long header and long request lines are correctly returned +# when nginx allocates a long header buffer + +like(http( + "GET / HTTP/1.0" . CRLF . + "Host: foo" . CRLF . + "X-Foo: foo" . ("1234567890" x 20) . "bar" . CRLF . + CRLF +), qr/X-Foo: foo(1234567890){20}bar/, 'long header'); + +like(http( + "GET /foo" . ("1234567890" x 20) . "bar HTTP/1.0" . CRLF . + "Host: foo" . CRLF . + CRLF +), qr!X-URI: /foo(1234567890){20}bar!, 'long request line'); + +# the same as the above, but with pipelining, so there is a buffer +# allocated in the previous request + +like(http( + "GET / HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "X-Foo: " . ("1234567890" x 20) . CRLF . + CRLF . + "GET / HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "Connection: close" . CRLF . + "X-Foo: foo" . ("1234567890" x 20) . "bar" . CRLF . + CRLF +), qr/X-Foo: foo(1234567890){20}bar/, 'long header after pipelining'); + +like(http( + "GET / HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "X-Foo: " . ("1234567890" x 20) . CRLF . + CRLF . + "GET /foo" . ("1234567890" x 20) . "bar HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "Connection: close" . CRLF . + CRLF +), qr!X-URI: /foo(1234567890){20}bar!, 'long request line after pipelining'); + +# the same as the above, but with keepalive; this ensures that previously +# allocated buffers are properly cleaned up when we set keepalive handler + +like(http( + "GET / HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "X-Foo: " . ("1234567890" x 20) . CRLF . + CRLF, +sleep => 0.1, body => + "GET / HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "Connection: close" . CRLF . + "X-Foo: foo" . ("1234567890" x 20) . "bar" . CRLF . + CRLF +), qr/X-Foo: foo(1234567890){20}bar/, 'long header after keepalive'); + +like(http( + "GET / HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "X-Foo: " . ("1234567890" x 20) . CRLF . + CRLF, +sleep => 0.1, body => + "GET /foo" . ("1234567890" x 20) . "bar HTTP/1.1" . CRLF . + "Host: foo" . CRLF . + "Connection: close" . CRLF . + CRLF +), qr!X-URI: /foo(1234567890){20}bar!, 'long request line after keepalive'); + ###############################################################################