changeset 1613:d7ec131d305a

Tests: reworked proxy_unfinished.t to use http_content(). This somewhat simplifies tests and makes it possible to better check for unexpected corruption of chunked responses, such as the one recently fixed in nginx-quic experimental branch.
author Maxim Dounin <mdounin@mdounin.ru>
date Tue, 17 Nov 2020 17:39:11 +0300
parents 8659123d2d37
children bc0990ea2e5b
files lib/Test/Nginx.pm proxy_unfinished.t
diffstat 2 files changed, 18 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/lib/Test/Nginx.pm
+++ b/lib/Test/Nginx.pm
@@ -853,12 +853,18 @@ sub http_content {
 	}
 
 	my $content = '';
+	my $len = -1;
+
 	while ($body =~ /\G\x0d?\x0a?([0-9a-f]+)\x0d\x0a?/gcmsi) {
-		my $len = hex($1);
+		$len = hex($1);
 		$content .= substr($body, pos($body), $len);
 		pos($body) += $len;
 	}
 
+	if ($len != 0) {
+		$content .= '[no-last-chunk]';
+	}
+
 	return $content;
 }
 
--- a/proxy_unfinished.t
+++ b/proxy_unfinished.t
@@ -105,28 +105,28 @@ like(http_get('/cache/chunked'), qr/MISS
 
 # make sure there is no final chunk in unfinished responses
 
-like(http_get_11('/length'), qr/unfinished(?!.*\x0d\x0a?0\x0d\x0a?)/s,
+like(http_get_11('/length'), qr/unfinished.*no-last-chunk/s,
 	'length no final chunk');
-like(http_get_11('/chunked'), qr/unfinished(?!.*\x0d\x0a?0\x0d\x0a?)/s,
+like(http_get_11('/chunked'), qr/unfinished.*no-last-chunk/s,
 	'chunked no final chunk');
 
 # but there is final chunk in complete responses
 
-like(http_get_11('/length/ok'), qr/finished.*\x0d\x0a?0\x0d\x0a?/s,
+like(http_get_11('/length/ok'), qr/finished\x0d\x0a$/s,
 	'length final chunk');
-like(http_get_11('/chunked/ok'), qr/finished.*\x0d\x0a?0\x0d\x0a?/s,
+like(http_get_11('/chunked/ok'), qr/finished\x0d\x0a$/s,
 	'chunked final chunk');
 
 # the same with proxy_buffering set to off
 
-like(http_get_11('/un/length'), qr/unfinished(?!.*\x0d\x0a?0\x0d\x0a?)/s,
+like(http_get_11('/un/length'), qr/unfinished.*no-last-chunk/s,
 	'unbuffered length no final chunk');
-like(http_get_11('/un/chunked'), qr/unfinished(?!.*\x0d\x0a?0\x0d\x0a?)/s,
+like(http_get_11('/un/chunked'), qr/unfinished.*no-last-chunk/s,
 	'unbuffered chunked no final chunk');
 
-like(http_get_11('/un/length/ok'), qr/finished.*\x0d\x0a?0\x0d\x0a?/s,
+like(http_get_11('/un/length/ok'), qr/finished\x0d\x0a$/s,
 	'unbuffered length final chunk');
-like(http_get_11('/un/chunked/ok'), qr/finished.*\x0d\x0a?0\x0d\x0a?/s,
+like(http_get_11('/un/chunked/ok'), qr/finished\x0d\x0a$/s,
 	'unbuffered chunked final chunk');
 
 # big responses
@@ -144,7 +144,7 @@ chmod(0000, $t->testdir() . '/proxy_temp
 my $r = http_get_11('/proxy/big.html', sleep => 0.5);
 
 SKIP: {
-skip 'finished', 1 if length(http_content($r)) == 1024 * 1024 + 8;
+skip 'finished', 1 if length($r) == 1024 * 1024 + 8;
 
 like($r, qr/X(?!.*\x0d\x0a?0\x0d\x0a?)/s, 'no proxy temp');
 
@@ -157,12 +157,12 @@ chmod(0700, $t->testdir() . '/proxy_temp
 sub http_get_11 {
 	my ($uri, %extra) = @_;
 
-	return http(
+	return http_content(http(
 		"GET $uri HTTP/1.1" . CRLF .
 		"Connection: close" . CRLF .
 		"Host: localhost" . CRLF . CRLF,
 		%extra
-	);
+	));
 }
 
 ###############################################################################