changeset 1143:b9d9c962255f

Tests: more large_client_header_buffers tests.
author Maxim Dounin <mdounin@mdounin.ru>
date Wed, 01 Mar 2017 21:18:28 +0300
parents baeebac35a2e
children 66c7dee0431c
files http_header_buffers.t
diffstat 1 files changed, 88 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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');
+
 ###############################################################################