[master] a9dc4a2 Extract the two bits of information we need from the unadultered beresp, rather than saving the entire thing.

Poul-Henning Kamp phk at varnish-cache.org
Mon Mar 7 11:12:15 CET 2011


commit a9dc4a2abb92dfca3273ca20616eed5ad3e78b1a
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Mar 7 10:11:08 2011 +0000

    Extract the two bits of information we need from the unadultered beresp,
    rather than saving the entire thing.
    
    This also moves a bit more of the fetch-policy/standards-compliance into
    rfc2616.c

diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index 7c97012..ca1cdff 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -273,7 +273,6 @@ struct worker {
 	struct ws		ws[1];
 	struct http		*http[3];
 	struct http		*bereq;
-	struct http		*beresp1;
 	struct http		*beresp;
 	struct http		*resp;
 
@@ -294,6 +293,8 @@ struct worker {
 	unsigned		is_gzip;
 	unsigned		do_gunzip;
 	unsigned		is_gunzip;
+	unsigned		do_close;
+	char			*h_content_length;
 
 	/* ESI stuff */
 	struct vep_state	*vep;
@@ -651,7 +652,7 @@ int EXP_NukeOne(const struct sess *sp, struct lru *lru);
 /* cache_fetch.c */
 struct storage *FetchStorage(const struct sess *sp, ssize_t sz);
 int FetchHdr(struct sess *sp);
-int FetchBody(struct sess *sp, const struct http *hp);
+int FetchBody(struct sess *sp);
 int FetchReqBody(struct sess *sp);
 void Fetch_Init(void);
 
diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
index c991400..30ad63a 100644
--- a/bin/varnishd/cache_center.c
+++ b/bin/varnishd/cache_center.c
@@ -229,7 +229,6 @@ cnt_deliver(struct sess *sp)
 		sp->director = NULL;
 		sp->wrk->bereq = NULL;
 		sp->wrk->beresp = NULL;
-		sp->wrk->beresp1 = NULL;
 		sp->wrk->resp = NULL;
 		sp->step = STP_RECV;
 		return (0);
@@ -475,6 +474,8 @@ cnt_fetch(struct sess *sp)
 
 	AN(sp->director);
 	AZ(sp->vbc);
+	AZ(sp->wrk->h_content_length);
+	AZ(sp->wrk->do_close);
 
 	/* sp->wrk->http[0] is (still) bereq */
 	sp->wrk->beresp = sp->wrk->http[1];
@@ -500,11 +501,11 @@ cnt_fetch(struct sess *sp)
 	http_CollectHdr(sp->wrk->beresp, H_Vary);
 
 	/*
-	 * Save a copy before it might get mangled in VCL.  When it comes to
-	 * dealing with the body, we want to see the unadultered headers.
-	 */
-	sp->wrk->beresp1 = sp->wrk->http[2];
-	*sp->wrk->beresp1 = *sp->wrk->beresp;
+	 * Figure out how the fetch is supposed to happen, before the
+	 * headers are adultered by VCL
+	 * Also sets other sp->wrk variables 
+	 */ 
+	sp->wrk->body_status = RFC2616_Body(sp);
 
 	if (i) {
 		if (sp->objcore != NULL) {
@@ -513,9 +514,10 @@ cnt_fetch(struct sess *sp)
 			sp->objcore = NULL;
 		}
 		AZ(sp->obj);
+		sp->wrk->do_close = 0;
+		sp->wrk->h_content_length = NULL;
 		sp->wrk->bereq = NULL;
 		sp->wrk->beresp = NULL;
-		sp->wrk->beresp1 = NULL;
 		sp->err_code = 503;
 		sp->step = STP_ERROR;
 		return (0);
@@ -555,7 +557,6 @@ cnt_fetch(struct sess *sp)
 
 	sp->wrk->do_esi = 0;
 
-	sp->wrk->body_status = RFC2616_Body(sp);
 
 	AZ(sp->wrk->storage_hint);
 
@@ -698,11 +699,13 @@ cnt_fetch(struct sess *sp)
 		sp->obj->last_modified = sp->wrk->entered;
 
 	/* Use unmodified headers*/
-	i = FetchBody(sp, sp->wrk->beresp1);
+	i = FetchBody(sp);
+
+	sp->wrk->do_close = 0;
+	sp->wrk->h_content_length = NULL;
 
 	sp->wrk->bereq = NULL;
 	sp->wrk->beresp = NULL;
-	sp->wrk->beresp1 = NULL;
 	sp->wrk->vfp = NULL;
 	AZ(sp->wrk->wfd);
 	AZ(sp->vbc);
diff --git a/bin/varnishd/cache_fetch.c b/bin/varnishd/cache_fetch.c
index 911d576..cc17733 100644
--- a/bin/varnishd/cache_fetch.c
+++ b/bin/varnishd/cache_fetch.c
@@ -482,9 +482,8 @@ FetchHdr(struct sess *sp)
 /*--------------------------------------------------------------------*/
 
 int
-FetchBody(struct sess *sp, const struct http *hp)
+FetchBody(struct sess *sp)
 {
-	char *b;
 	int cls;
 	struct storage *st;
 	int mklen;
@@ -517,8 +516,8 @@ FetchBody(struct sess *sp, const struct http *hp)
 		mklen = 1;
 		break;
 	case BS_LENGTH:
-		AN(http_GetHdr(hp, H_Content_Length, &b));
-		cls = fetch_straight(sp, sp->wrk->htc, b);
+		cls = fetch_straight(sp, sp->wrk->htc,
+		    sp->wrk->h_content_length);
 		mklen = 1;
 		break;
 	case BS_CHUNKED:
@@ -555,11 +554,7 @@ FetchBody(struct sess *sp, const struct http *hp)
 		return (__LINE__);
 	}
 
-	if (cls == 0 && http_HdrIs(hp, H_Connection, "close"))
-		cls = 1;
-
-	if (cls == 0 && hp->protover < 1.1 &&
-	    !http_HdrIs(hp, H_Connection, "keep-alive"))
+	if (cls == 0 && sp->wrk->do_close)
 		cls = 1;
 
 	if (cls < 0) {
@@ -593,9 +588,6 @@ FetchBody(struct sess *sp, const struct http *hp)
 		    "Content-Length: %u", sp->obj->len);
 	}
 
-	if (http_HdrIs(hp, H_Connection, "close"))
-		cls = 1;
-
 	if (cls)
 		VDI_CloseFd(sp);
 	else
diff --git a/bin/varnishd/cache_pool.c b/bin/varnishd/cache_pool.c
index 49cfc9f..361743f 100644
--- a/bin/varnishd/cache_pool.c
+++ b/bin/varnishd/cache_pool.c
@@ -179,13 +179,11 @@ wrk_thread_real(struct wq *qp, unsigned shm_workspace, unsigned sess_workspace,
 		w->lastused = NAN;
 		WS_Reset(w->ws, NULL);
 		w->bereq = NULL;
-		w->beresp1 = NULL;
 		w->beresp = NULL;
 		w->resp = NULL;
 		w->storage_hint = NULL;
 		w->wrq->func(w, w->wrq->priv);
 		AZ(w->bereq);
-		AZ(w->beresp1);
 		AZ(w->beresp);
 		AZ(w->resp);
 		WS_Assert(w->ws);
diff --git a/bin/varnishd/rfc2616.c b/bin/varnishd/rfc2616.c
index 1c07751..0295be5 100644
--- a/bin/varnishd/rfc2616.c
+++ b/bin/varnishd/rfc2616.c
@@ -160,7 +160,7 @@ RFC2616_Ttl(const struct sess *sp)
 }
 
 /*--------------------------------------------------------------------
- * Body existence and fetch method
+ * Body existence, fetch method and close policy.
  */
 
 enum body_status
@@ -169,7 +169,14 @@ RFC2616_Body(const struct sess *sp)
 	struct http *hp;
 	char *b;
 
-	hp = sp->wrk->beresp1;
+	hp = sp->wrk->beresp;
+
+	if (hp->protover < 1.1 && !http_HdrIs(hp, H_Connection, "keep-alive"))
+		sp->wrk->do_close = 1;
+	else if (http_HdrIs(hp, H_Connection, "close"))
+		sp->wrk->do_close = 1;
+	else
+		sp->wrk->do_close = 0;
 
 	if (!strcasecmp(http_GetReq(sp->wrk->bereq), "head")) {
 		/*
@@ -218,7 +225,7 @@ RFC2616_Body(const struct sess *sp)
 		return (BS_ERROR);
 	}
 
-	if (http_GetHdr(hp, H_Content_Length, &b)) {
+	if (http_GetHdr(hp, H_Content_Length, &sp->wrk->h_content_length)) {
 		sp->wrk->stats.fetch_length++;
 		return (BS_LENGTH);
 	}



More information about the varnish-commit mailing list