[master] 8374871 Pack obj->http into a oa_http bytestring and populate the obj->http structure from that while we still need it.

Poul-Henning Kamp phk at FreeBSD.org
Thu Aug 7 09:50:23 CEST 2014


commit 83748716c2a7f6dea841f3e546809c80c75da78b
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Aug 7 07:49:43 2014 +0000

    Pack obj->http into a oa_http bytestring and populate the obj->http
    structure from that while we still need it.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index fe619fe..78d84a6 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -561,6 +561,8 @@ struct object {
 
 	uint8_t			*vary;
 
+	uint8_t			*oa_http;
+
 	unsigned		gziped:1;
 	unsigned		changed_gzip:1;
 
@@ -948,7 +950,6 @@ void HTTP_Init(void);
 void http_PutResponse(struct http *to, const char *proto, uint16_t status,
     const char *response);
 void http_FilterReq(struct http *to, const struct http *fm, unsigned how);
-void http_FilterResp(const struct http *fm, struct http *to, unsigned how);
 uint8_t *HTTP_Encode(const struct http *fm, struct ws *ws, unsigned how);
 int HTTP_Decode(struct http *to, uint8_t *fm);
 void http_ForceHeader(struct http *to, const char *hdr, const char *val);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 4fab36b..9a896fd 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -101,7 +101,6 @@ vbf_beresp2obj(struct busyobj *bo)
 	int varyl = 0;
 	uint16_t nhttp;
 	struct object *obj;
-	struct http *hp, *hp2;
 
 	l = 0;
 
@@ -156,23 +155,19 @@ vbf_beresp2obj(struct busyobj *bo)
 	WS_Assert(bo->ws_o);
 
 	/* Filter into object */
-	hp = bo->beresp;
-	hp2 = obj->http;
+	obj->http->logtag = SLT_ObjMethod;
+	obj->oa_http = HTTP_Encode(bo->beresp, bo->ws_o,
+	    bo->uncacheable ? HTTPH_R_PASS : HTTPH_A_INS);
+	AN(obj->oa_http);
+	AZ(HTTP_Decode(obj->http, obj->oa_http));
 
-	hp2->logtag = SLT_ObjMethod;
-	http_FilterResp(hp, hp2, bo->uncacheable ? HTTPH_R_PASS : HTTPH_A_INS);
-	http_CopyHome(hp2);
-
-	if (http_GetHdr(hp, H_Last_Modified, &b))
+	if (http_GetHdr(bo->beresp, H_Last_Modified, &b))
 		AZ(ObjSetDouble(bo->fetch_objcore, bo->stats, OA_LASTMODIFIED,
 		    VTIM_parse(b)));
 	else
 		AZ(ObjSetDouble(bo->fetch_objcore, bo->stats, OA_LASTMODIFIED,
 		    floor(bo->fetch_objcore->exp.t_origin)));
 
-	/* Disassociate the obj from the bo's workspace */
-	hp2->ws = NULL;
-
 	return (0);
 }
 
diff --git a/bin/varnishd/cache/cache_http.c b/bin/varnishd/cache/cache_http.c
index 6617381..f2e310f 100644
--- a/bin/varnishd/cache/cache_http.c
+++ b/bin/varnishd/cache/cache_http.c
@@ -136,7 +136,7 @@ HTTP_estimate(unsigned nhttp)
 {
 
 	/* XXX: We trust the structs to size-aligned as necessary */
-	return (sizeof (struct http) + (sizeof (txt) + 1) * nhttp);
+	return (PRNDUP(sizeof (struct http) + sizeof(txt) * nhttp + nhttp));
 }
 
 struct http *
@@ -605,12 +605,14 @@ http_EstimateWS(const struct http *fm, unsigned how, uint16_t *nhd)
 {
 	unsigned u, l;
 
-	l = 0;
-	*nhd = HTTP_HDR_FIRST;
+	l = 4;
+	*nhd = 1 + HTTP_HDR_FIRST - 3;
 	CHECK_OBJ_NOTNULL(fm, HTTP_MAGIC);
 	for (u = 0; u < fm->nhd; u++) {
-		if (fm->hd[u].b == NULL)
+		if (u == HTTP_HDR_METHOD || u == HTTP_HDR_URL)
 			continue;
+		AN(fm->hd[u].b);
+		AN(fm->hd[u].e);
 		if (fm->hdf[u] & HDF_FILTER)
 			continue;
 #define HTTPH(a, b, c) \
@@ -618,11 +620,10 @@ http_EstimateWS(const struct http *fm, unsigned how, uint16_t *nhd)
 			continue;
 #include "tbl/http_headers.h"
 #undef HTTPH
-		l += PRNDUP(Tlen(fm->hd[u]) + 1L);
+		l += Tlen(fm->hd[u]) + 1L;
 		(*nhd)++;
-		// fm->hdf[u] |= HDF_COPY;
 	}
-	return (l);
+	return (PRNDUP(l + 1L));
 }
 
 /*--------------------------------------------------------------------
@@ -673,6 +674,7 @@ HTTP_Encode(const struct http *fm, struct ws *ws, unsigned how)
 	assert(p <= e);
 	e = (uint8_t*)ws->f;
 	vbe16enc(e, n + 1);
+	VSLb(fm->vsl, SLT_Debug, "HTTPENC %zd",  p - (uint8_t*)ws->f);
 	WS_ReleaseP(ws, (void*)p);
 	return (e);
 }
@@ -711,7 +713,6 @@ HTTP_Decode(struct http *to, uint8_t *fm)
 	return (-1);
 }
 
-
 /*--------------------------------------------------------------------*/
 
 static void
@@ -769,21 +770,6 @@ http_FilterReq(struct http *to, const struct http *fm, unsigned how)
 	http_filterfields(to, fm, how);
 }
 
-/*--------------------------------------------------------------------*/
-
-void
-http_FilterResp(const struct http *fm, struct http *to, unsigned how)
-{
-
-	CHECK_OBJ_NOTNULL(fm, HTTP_MAGIC);
-	CHECK_OBJ_NOTNULL(to, HTTP_MAGIC);
-	to->status = fm->status;
-	http_linkh(to, fm, HTTP_HDR_PROTO);
-	http_linkh(to, fm, HTTP_HDR_STATUS);
-	http_linkh(to, fm, HTTP_HDR_REASON);
-	http_filterfields(to, fm, how);
-}
-
 /*--------------------------------------------------------------------
  * Merge two HTTP headers the "wrong" way. Used by backend IMS to
  * merge in the headers of the validated object with the headers of
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 8997f91..3be502c 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -105,7 +105,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
 		EXP_Touch(req->objcore, req->t_prev);
 
 	HTTP_Setup(req->resp, req->ws, req->vsl, SLT_RespMethod);
-	http_FilterResp(req->obj->http, req->resp, 0);
+	AZ(HTTP_Decode(req->resp, req->obj->oa_http));
 	http_ForceField(req->resp, HTTP_HDR_PROTO, "HTTP/1.1");
 
 	if (req->wrk->stats.cache_hit)



More information about the varnish-commit mailing list