[master] bea20dd48 vbr: Always remove the 304 response C-L header

Walid Boudebouda walid.boudebouda at gmail.com
Mon Sep 1 08:46:05 UTC 2025


commit bea20dd48cebe70dc6aa0efaf028f686741abe20
Author: Walid Boudebouda <walid.boudebouda at gmail.com>
Date:   Tue Aug 12 10:56:50 2025 +0200

    vbr: Always remove the 304 response C-L header
    
    And copy the stale object's C-L only when available. When it is not,
    it's fine to leave the response without C-L since the delivery code
    will fall back to a chunked response.

diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 0fc041111..a7e7e2b56 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -492,10 +492,14 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
 			break;
 		case VCL_RET_BERESP:
 			http_SetStatus(bo->beresp, 200, NULL);
-			http_ForceHeader(bo->beresp, H_Content_Length,
-			    HTTP_GetHdrPack(wrk, bo->stale_oc,
-			    H_Content_Length));
+			http_Unset(bo->beresp, H_Content_Length);
 			http_Unset(bo->beresp, H_Content_Encoding);
+			q = HTTP_GetHdrPack(wrk, bo->stale_oc,
+			    H_Content_Length);
+			if (q != NULL) {
+				http_ForceHeader(bo->beresp,
+				    H_Content_Length, q);
+			}
 			q = HTTP_GetHdrPack(wrk, bo->stale_oc,
 			    H_Content_Encoding);
 			if (q != NULL) {
diff --git a/bin/varnishtest/tests/b00096.vtc b/bin/varnishtest/tests/b00096.vtc
new file mode 100644
index 000000000..dcef6aac0
--- /dev/null
+++ b/bin/varnishtest/tests/b00096.vtc
@@ -0,0 +1,64 @@
+varnishtest "Test vcl_backend_refresh on streaming object"
+
+barrier b1 sock 2
+
+server s1 {
+	rxreq
+	txresp -hdr "Etag: abcd" -nolen -hdr "Transfer-encoding: chunked"
+	chunkedlen 10
+	barrier b1 sync
+	chunkedlen 10
+	chunkedlen 0
+} -start
+
+server s2 {
+	rxreq
+	expect req.http.if-none-match == "abcd"
+	txresp -status 304
+} -start
+
+varnish v1 -vcl+backend {
+	import vtc;
+
+	sub vcl_recv {
+		if (req.http.stale) {
+			set req.backend_hint = s2;
+		}
+	}
+
+	sub vcl_backend_response {
+		set beresp.ttl = 0.01s;
+		set beresp.grace = 0s;
+		set beresp.keep = 10m;
+		if (bereq.http.stale) {
+			vtc.barrier_sync("${b1_sock}");
+		}
+	}
+
+	sub vcl_backend_refresh {
+		return (beresp);
+	}
+
+} -start
+
+# insert object in cache
+client c1 {
+	txreq
+	rxresp
+	expect resp.status == 200
+	expect resp.bodylen == 20
+} -start
+
+# let the object die
+delay 0.02
+
+# object is still being fetched at this point
+client c2 {
+	txreq -hdr "stale: 1"
+	rxresp
+	expect resp.status == 200
+	expect resp.bodylen == 20
+} -start
+
+client c1 -wait
+client c2 -wait


More information about the varnish-commit mailing list