[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