[master] 5fbe576 Move the beresp body determination to rfc2616 territory.

Poul-Henning Kamp phk at FreeBSD.org
Wed Sep 20 19:01:04 UTC 2017


commit 5fbe576f9907d603435ec7afd6dfd893350b396f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Sep 20 13:43:52 2017 +0000

    Move the beresp body determination to rfc2616 territory.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index e3bc4d4..a1e8b36 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1076,6 +1076,7 @@ unsigned RFC2616_Req_Gzip(const struct http *);
 int RFC2616_Do_Cond(const struct req *sp);
 void RFC2616_Weaken_Etag(struct http *hp);
 void RFC2616_Vary_AE(struct http *hp);
+void RFC2616_Response_Body(const struct worker *, const struct busyobj *);
 
 /* stevedore.c */
 int STV_NewObject(struct worker *, struct objcore *,
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 21661c8..0dc81de 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -304,6 +304,15 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
 
 	http_VSL_log(bo->beresp);
 
+	RFC2616_Response_Body(wrk, bo);
+	if (bo->htc->body_status == BS_ERROR) {
+		bo->htc->doclose = SC_RX_BODY;
+		VDI_Finish(bo->wrk, bo);
+		VSLb(bo->vsl, SLT_Error, "Body cannot be fetched");
+		assert(bo->director_state == DIR_S_NULL);
+		return (F_STP_ERROR);
+	}
+
 	if (!http_GetHdr(bo->beresp, H_Date, NULL)) {
 		/*
 		 * RFC 2616 14.18 Date: The Date general-header field
@@ -327,68 +336,6 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
 	http_CollectHdr(bo->beresp, H_Cache_Control);
 	http_CollectHdr(bo->beresp, H_Vary);
 
-	/*
-	 * Figure out how the fetch is supposed to happen, before the
-	 * headers are adultered by VCL
-	 */
-	if (!strcasecmp(http_GetMethod(bo->bereq), "head")) {
-		/*
-		 * A HEAD request can never have a body in the reply,
-		 * no matter what the headers might say.
-		 * [RFC7231 4.3.2 p25]
-		 */
-		wrk->stats->fetch_head++;
-		bo->htc->body_status = BS_NONE;
-	} else if (http_GetStatus(bo->beresp) <= 199) {
-		/*
-		 * 1xx responses never have a body.
-		 * [RFC7230 3.3.2 p31]
-		 * ... but we should never see them.
-		 */
-		wrk->stats->fetch_1xx++;
-		bo->htc->body_status = BS_ERROR;
-	} else if (http_IsStatus(bo->beresp, 204)) {
-		/*
-		 * 204 is "No Content", obviously don't expect a body.
-		 * [RFC7230 3.3.1 p29 and 3.3.2 p31]
-		 */
-		wrk->stats->fetch_204++;
-		if ((http_GetHdr(bo->beresp, H_Content_Length, NULL) &&
-		    bo->htc->content_length != 0) ||
-		    http_GetHdr(bo->beresp, H_Transfer_Encoding, NULL))
-			bo->htc->body_status = BS_ERROR;
-		else
-			bo->htc->body_status = BS_NONE;
-	} else if (http_IsStatus(bo->beresp, 304)) {
-		/*
-		 * 304 is "Not Modified" it has no body.
-		 * [RFC7230 3.3 p28]
-		 */
-		wrk->stats->fetch_304++;
-		bo->htc->body_status = BS_NONE;
-	} else if (bo->htc->body_status == BS_CHUNKED) {
-		wrk->stats->fetch_chunked++;
-	} else if (bo->htc->body_status == BS_LENGTH) {
-		assert(bo->htc->content_length > 0);
-		wrk->stats->fetch_length++;
-	} else if (bo->htc->body_status == BS_EOF) {
-		wrk->stats->fetch_eof++;
-	} else if (bo->htc->body_status == BS_ERROR) {
-		wrk->stats->fetch_bad++;
-	} else if (bo->htc->body_status == BS_NONE) {
-		wrk->stats->fetch_none++;
-	} else {
-		WRONG("wrong bodystatus");
-	}
-
-	if (bo->htc->body_status == BS_ERROR) {
-		bo->htc->doclose = SC_RX_BODY;
-		VDI_Finish(bo->wrk, bo);
-		VSLb(bo->vsl, SLT_Error, "Body cannot be fetched");
-		assert(bo->director_state == DIR_S_NULL);
-		return (F_STP_ERROR);
-	}
-
 	if (bo->fetch_objcore->flags & OC_F_PRIVATE) {
 		/* private objects have negative TTL */
 		bo->fetch_objcore->t_origin = now;
diff --git a/bin/varnishd/cache/cache_rfc2616.c b/bin/varnishd/cache/cache_rfc2616.c
index c649897..67679e1 100644
--- a/bin/varnishd/cache/cache_rfc2616.c
+++ b/bin/varnishd/cache/cache_rfc2616.c
@@ -325,3 +325,68 @@ RFC2616_Vary_AE(struct http *hp)
 		http_SetHeader(hp, "Vary: Accept-Encoding");
 	}
 }
+
+/*--------------------------------------------------------------------*/
+
+void
+RFC2616_Response_Body(const struct worker *wrk, const struct busyobj *bo)
+{
+
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+
+	/*
+	 * Figure out how the fetch is supposed to happen, before the
+	 * headers are adultered by VCL
+	 */
+	if (!strcasecmp(http_GetMethod(bo->bereq), "head")) {
+		/*
+		 * A HEAD request can never have a body in the reply,
+		 * no matter what the headers might say.
+		 * [RFC7231 4.3.2 p25]
+		 */
+		wrk->stats->fetch_head++;
+		bo->htc->body_status = BS_NONE;
+	} else if (http_GetStatus(bo->beresp) <= 199) {
+		/*
+		 * 1xx responses never have a body.
+		 * [RFC7230 3.3.2 p31]
+		 * ... but we should never see them.
+		 */
+		wrk->stats->fetch_1xx++;
+		bo->htc->body_status = BS_ERROR;
+	} else if (http_IsStatus(bo->beresp, 204)) {
+		/*
+		 * 204 is "No Content", obviously don't expect a body.
+		 * [RFC7230 3.3.1 p29 and 3.3.2 p31]
+		 */
+		wrk->stats->fetch_204++;
+		if ((http_GetHdr(bo->beresp, H_Content_Length, NULL) &&
+		    bo->htc->content_length != 0) ||
+		    http_GetHdr(bo->beresp, H_Transfer_Encoding, NULL))
+			bo->htc->body_status = BS_ERROR;
+		else
+			bo->htc->body_status = BS_NONE;
+	} else if (http_IsStatus(bo->beresp, 304)) {
+		/*
+		 * 304 is "Not Modified" it has no body.
+		 * [RFC7230 3.3 p28]
+		 */
+		wrk->stats->fetch_304++;
+		bo->htc->body_status = BS_NONE;
+	} else if (bo->htc->body_status == BS_CHUNKED) {
+		wrk->stats->fetch_chunked++;
+	} else if (bo->htc->body_status == BS_LENGTH) {
+		assert(bo->htc->content_length > 0);
+		wrk->stats->fetch_length++;
+	} else if (bo->htc->body_status == BS_EOF) {
+		wrk->stats->fetch_eof++;
+	} else if (bo->htc->body_status == BS_ERROR) {
+		wrk->stats->fetch_bad++;
+	} else if (bo->htc->body_status == BS_NONE) {
+		wrk->stats->fetch_none++;
+	} else {
+		WRONG("wrong bodystatus");
+	}
+}
+


More information about the varnish-commit mailing list