[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