[master] b49127856 Dont force an Accept-Ranges header on non-cacheable responses.

Poul-Henning Kamp phk at FreeBSD.org
Mon May 17 07:54:05 UTC 2021


commit b49127856b434369df69fa70fe26e0e49306695f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon May 17 07:52:15 2021 +0000

    Dont force an Accept-Ranges header on non-cacheable responses.
    
    Fixes: #3251

diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 0d26f4615..34fde97a1 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -204,6 +204,7 @@ Resp_Setup_Synth(struct req *req)
 static enum req_fsm_nxt v_matchproto_(req_state_f)
 cnt_deliver(struct worker *wrk, struct req *req)
 {
+	unsigned status;
 
 	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
 	CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -223,6 +224,11 @@ cnt_deliver(struct worker *wrk, struct req *req)
 		return (REQ_FSM_MORE);
 	}
 
+	status = http_GetStatus(req->resp);
+	if (cache_param->http_range_support && status == 200 &&
+	    !(req->objcore->flags & OC_F_PRIVATE))
+		http_ForceHeader(req->resp, H_Accept_Ranges, "bytes");
+
 	VCL_deliver_method(req->vcl, wrk, req, NULL, NULL);
 	VSLb_ts_req(req, "Process", W_TIM_real(wrk));
 
@@ -437,9 +443,6 @@ cnt_transmit(struct worker *wrk, struct req *req)
 		VSLb(req->vsl, SLT_Error, "Failure to push processors");
 		req->doclose = SC_OVERLOAD;
 	} else {
-		if (cache_param->http_range_support && status == 200)
-			http_ForceHeader(req->resp, H_Accept_Ranges, "bytes");
-
 		if (status < 200 || status == 204) {
 			// rfc7230,l,1691,1695
 			http_Unset(req->resp, H_Content_Length);
@@ -465,8 +468,8 @@ cnt_transmit(struct worker *wrk, struct req *req)
 		}
 		if (req->resp_len == 0)
 			sendbody = 0;
+		req->transport->deliver(req, boc, sendbody);
 	}
-	req->transport->deliver(req, boc, sendbody);
 
 	VSLb_ts_req(req, "Resp", W_TIM_real(wrk));
 
diff --git a/bin/varnishtest/tests/c00034.vtc b/bin/varnishtest/tests/c00034.vtc
index d5432a430..c3f904663 100644
--- a/bin/varnishtest/tests/c00034.vtc
+++ b/bin/varnishtest/tests/c00034.vtc
@@ -16,6 +16,7 @@ varnish v1 -cliok "param.set http_range_support off"
 client c1 {
 	txreq -hdr "Range: bytes=0-9"
 	rxresp
+	expect resp.accept-ranges == "resp.accept-ranges"
 	expect resp.status == 200
 	expect resp.bodylen == 100
 } -run
@@ -85,6 +86,7 @@ client c1 {
 	expect resp.status == 206
 	expect resp.bodylen == 50
 	expect resp.http.content-range == "bytes 0-49/100"
+	expect resp.http.accept-ranges == "bytes"
 
 	txreq -hdr "Range: bytes=50-99"
 	rxresp
@@ -211,3 +213,32 @@ client c2 {
 		expect resp.body == BL
 	} -run
 } -run
+
+varnish v1 -vsl_catchup
+
+server s1 {
+	rxreq
+	txresp
+	rxreq
+	txresp -hdr "Accept-Ranges: foobar"
+} -start
+
+varnish v1 -vcl+backend {
+	sub vcl_recv {
+		return (pass);
+	}
+	sub vcl_deliver {
+		set resp.http.foobar = resp.http.accept-ranges;
+	}
+}
+
+client c1 {
+	txreq
+	rxresp
+	expect resp.http.foobar == ""
+	expect resp.http.accept-ranges == resp.http.accept-ranges
+	txreq
+	rxresp
+	expect resp.http.foobar == "foobar"
+	expect resp.http.accept-ranges == foobar
+} -run
diff --git a/doc/changes.rst b/doc/changes.rst
index b903369cd..aa6e744d6 100644
--- a/doc/changes.rst
+++ b/doc/changes.rst
@@ -35,6 +35,9 @@ release process.
 Varnish Cache 7.x.x (2021-09-15)
 ================================
 
+* Accept-Ranges headers are no longer generated for passed objects,
+  but must either come from the backend or be created in `vcl_deliver{}`
+
 * ACLs no longer produce VSL `VCL_acl` records by default, this must be
   explicitly enabled with `vcl <name> +log { ... }`.
 


More information about the varnish-commit mailing list