[master] 7da66c9b0 Improve streaming range responses

Poul-Henning Kamp phk at FreeBSD.org
Mon Jan 16 14:39:11 UTC 2023


commit 7da66c9b03f82b97e2476d5d0af62e58e0419216
Author: Gil Pedersen <git at gpost.dk>
Date:   Tue Nov 29 19:10:31 2022 +0100

    Improve streaming range responses
    
    This is an enhanced fix for #1777

diff --git a/bin/varnishd/cache/cache_range.c b/bin/varnishd/cache/cache_range.c
index b9aab9aed..695ca0211 100644
--- a/bin/varnishd/cache/cache_range.c
+++ b/bin/varnishd/cache/cache_range.c
@@ -124,7 +124,7 @@ vrg_dorange(struct req *req, void **priv)
 		high = req->resp_len - 1;
 	} else if (req->resp_len >= 0 && (high >= req->resp_len || high < 0))
 		high = req->resp_len - 1;
-	else if (high < 0 || req->resp_len < 0)
+	else if (high < 0)
 		return (NULL);			// Allow 200 response
 	/*
 	 * else (bo != NULL) {
@@ -136,13 +136,13 @@ vrg_dorange(struct req *req, void **priv)
 	if (req->resp_len >= 0 && low >= req->resp_len)
 		return ("low range beyond object");
 
-	if (req->resp_len >= 0)
+	if (req->resp_len >= 0) {
 		http_PrintfHeader(req->resp, "Content-Range: bytes %jd-%jd/%jd",
 		    (intmax_t)low, (intmax_t)high, (intmax_t)req->resp_len);
-	else
+		req->resp_len = (intmax_t)(1 + high - low);
+	} else
 		http_PrintfHeader(req->resp, "Content-Range: bytes %jd-%jd/*",
 		    (intmax_t)low, (intmax_t)high);
-	req->resp_len = (intmax_t)(1 + high - low);
 
 	vrg_priv = WS_Alloc(req->ws, sizeof *vrg_priv);
 	if (vrg_priv == NULL)
diff --git a/bin/varnishtest/tests/c00034.vtc b/bin/varnishtest/tests/c00034.vtc
index bc2af742e..4858d3967 100644
--- a/bin/varnishtest/tests/c00034.vtc
+++ b/bin/varnishtest/tests/c00034.vtc
@@ -178,12 +178,10 @@ client c5 {
 		-hdr "Range: bytes=2-5" \
 		-hdr "Accept-encoding: gzip"
 	rxresp
-	expect resp.status == 200
-	expect resp.http.Content-Range == <undef>
+	expect resp.status == 206
+	expect resp.http.Content-Range == "bytes 2-5/*"
 	expect resp.http.Content-Length == <undef>
-	expect resp.http.Content-Encoding == gzip
-	gunzip
-	expect resp.bodylen == 100
+	expect resp.bodylen == 4
 } -run
 
 # Test partial range with http2
diff --git a/bin/varnishtest/tests/e00015.vtc b/bin/varnishtest/tests/e00015.vtc
index 3edc19747..9f90bd3c2 100644
--- a/bin/varnishtest/tests/e00015.vtc
+++ b/bin/varnishtest/tests/e00015.vtc
@@ -87,8 +87,6 @@ varnish v1 -syntax 4.1 -vcl+backend {
 	}
 }
 
-# Note on Range requests: The range VDP is active, but as it cannot
-# reliably determine the size of the response, it falls back to a 200
 client c1 {
 	txreq -url /top2
 	rxresp
@@ -106,11 +104,10 @@ client c1 {
 	expect resp.http.filter0 == "esi"
 	expect resp.http.filters == "esi"
 
-	# see Note on Range above
 	txreq -url "/esi" -hdr "Range: bytes=1-2"
 	rxresp
-	expect resp.bodylen == 76
-	expect resp.status == 200
+	expect resp.bodylen == 2
+	expect resp.status == 206
 	expect resp.http.was == true
 	expect resp.http.filters == "esi range"
 
@@ -121,11 +118,10 @@ client c1 {
 	expect resp.http.was == true
 	expect resp.http.filters == "esi gunzip"
 
-	# see Note on Range above
 	txreq -url "/recurse" -hdr "Range: bytes=1-2"
 	rxresp
-	expect resp.bodylen == 120
-	expect resp.status == 200
+	expect resp.bodylen == 2
+	expect resp.status == 206
 	expect resp.http.was == true
 	expect resp.http.filters == "esi gunzip range"
 
@@ -136,4 +132,4 @@ client c1 {
 } -run
 
 varnish v1 -expect esi_errors == 0
-varnish v1 -expect MAIN.s_resp_bodybytes == 865
+varnish v1 -expect MAIN.s_resp_bodybytes == 673
diff --git a/bin/varnishtest/tests/g00005.vtc b/bin/varnishtest/tests/g00005.vtc
index 74b21de5b..1240c7a09 100644
--- a/bin/varnishtest/tests/g00005.vtc
+++ b/bin/varnishtest/tests/g00005.vtc
@@ -25,12 +25,13 @@ varnish v1 -cliok "param.set http_gzip_support true" -vcl+backend {
 } -start
 
 client c1 {
-	# no range support with streaming cache miss and gunzip
+	# cache miss
 	txreq -hdr "Range: bytes=3-5"
 	rxresp
-	expect resp.status == 200
-	expect resp.bodylen == "10"
+	expect resp.status == 206
+	expect resp.bodylen == "3"
 	expect resp.http.content-encoding == <undef>
+	expect resp.body == "BAR"
 } -run
 
 varnish v1 -vsl_catchup
diff --git a/bin/varnishtest/tests.disabled/r01506.vtc b/bin/varnishtest/tests/r01506.vtc
similarity index 92%
rename from bin/varnishtest/tests.disabled/r01506.vtc
rename to bin/varnishtest/tests/r01506.vtc
index 1d0f0bb3c..92192653a 100644
--- a/bin/varnishtest/tests.disabled/r01506.vtc
+++ b/bin/varnishtest/tests/r01506.vtc
@@ -33,7 +33,6 @@ client c1 {
 	txreq -url /1 -hdr "Range: bytes=17-101"
 	rxresphdrs
 	expect resp.status == 206
-	expect resp.http.content-length == 85
 	barrier b1 sync
 	rxrespbody
 	expect resp.bodylen == 85
@@ -59,15 +58,13 @@ client c1 {
 	expect resp.bodylen == 136
 	delay .1
 
-	# Invalid range
+	# Handles out of bounds range
 	txreq -url /4 -hdr "Range: bytes=102-200"
 	rxresphdrs
 	expect resp.status == 206
-	expect resp.http.content-length == 99
 	barrier b1 sync
-	recv 34
-	delay .3
-	expect_close
+	rxrespbody
+	expect resp.bodylen == 34
 } -run
 
 varnish v1 -expect sc_range_short == 1
diff --git a/bin/varnishtest/tests.disabled/r01732.vtc b/bin/varnishtest/tests/r01732.vtc
similarity index 100%
rename from bin/varnishtest/tests.disabled/r01732.vtc
rename to bin/varnishtest/tests/r01732.vtc
diff --git a/bin/varnishtest/tests/r01777.vtc b/bin/varnishtest/tests/r01777.vtc
index 6808023c7..ef8871153 100644
--- a/bin/varnishtest/tests/r01777.vtc
+++ b/bin/varnishtest/tests/r01777.vtc
@@ -14,5 +14,8 @@ varnish v1 -vcl+backend { } -start
 client c1 {
 	txreq -hdr "Range: bytes=0-129"
 	rxresp
-	expect resp.status == 200
+	expect resp.status == 206
+	expect resp.http.Content-Range == "bytes 0-129/*"
+	expect resp.http.Content-Length == <undef>
+	expect resp.bodylen == 128
 } -run


More information about the varnish-commit mailing list