Commit 96c2b817 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Fix the SHMlogging of HTTP protocol fields to happen when they cross

wires, rather than when they get manipulated in memory.


git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@1635 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent 94e0d8ba
......@@ -407,10 +407,10 @@ const char *http_StatusMessage(int);
void HTTP_Init(void);
void http_ClrHeader(struct http *to);
unsigned http_Write(struct worker *w, struct http *hp, int resp);
void http_GetReq(struct worker *w, int fd, struct http *to, struct http *fm);
void http_CopyReq(struct worker *w, int fd, struct http *to, struct http *fm);
void http_CopyResp(struct worker *w, int fd, struct http *to, struct http *fm);
void http_SetResp(struct worker *w, int fd, struct http *to, const char *proto, const char *status, const char *response);
void http_GetReq(struct http *to, struct http *fm);
void http_CopyReq(struct http *to, struct http *fm);
void http_CopyResp(struct http *to, struct http *fm);
void http_SetResp(struct http *to, const char *proto, const char *status, const char *response);
void http_FilterHeader(struct worker *w, int fd, struct http *to, struct http *fm, unsigned how);
void http_PutProtocol(struct worker *w, int fd, struct http *to, const char *protocol);
void http_PutStatus(struct worker *w, int fd, struct http *to, int status);
......@@ -431,7 +431,7 @@ int http_RecvHead(struct http *hp, int fd);
int http_DissectRequest(struct worker *w, struct http *sp, int fd);
int http_DissectResponse(struct worker *w, struct http *sp, int fd);
void http_DoConnection(struct sess *sp);
void http_CopyHome(struct http *hp);
void http_CopyHome(struct worker *w, int fd, struct http *hp);
#define HTTPH(a, b, c, d, e, f, g) extern char b[];
......
......@@ -288,7 +288,7 @@ cnt_fetch(struct sess *sp)
hp = bereq->http;
hp->logtag = HTTP_Tx;
http_GetReq(sp->wrk, sp->fd, hp, sp->http);
http_GetReq(hp, sp->http);
http_FilterHeader(sp->wrk, sp->fd, hp, sp->http, HTTPH_R_FETCH);
http_PrintfHeader(sp->wrk, sp->fd, hp, "X-Varnish: %u", sp->xid);
http_PrintfHeader(sp->wrk, sp->fd, hp,
......@@ -635,7 +635,7 @@ cnt_pipe(struct sess *sp)
hp = bereq->http;
hp->logtag = HTTP_Tx;
http_CopyReq(sp->wrk, sp->fd, hp, sp->http);
http_CopyReq(hp, sp->http);
http_FilterHeader(sp->wrk, sp->fd, hp, sp->http, HTTPH_R_PIPE);
http_PrintfHeader(sp->wrk, sp->fd, hp, "X-Varnish: %u", sp->xid);
http_PrintfHeader(sp->wrk, sp->fd, hp, "X-Forwarded-for: %s", sp->addr);
......
......@@ -320,9 +320,9 @@ Fetch(struct sess *sp)
http_Setup(hp2, b, len);
hp2->logtag = HTTP_Obj;
http_CopyResp(sp->wrk, sp->fd, hp2, hp);
http_CopyResp(hp2, hp);
http_FilterHeader(sp->wrk, sp->fd, hp2, hp, HTTPH_A_INS);
http_CopyHome(hp2);
http_CopyHome(sp->wrk, sp->fd, hp2);
if (body) {
if (http_GetHdr(hp, H_Content_Length, &b))
......
......@@ -681,7 +681,7 @@ http_RecvHead(struct http *hp, int fd)
/*--------------------------------------------------------------------*/
static void
http_seth(struct worker *w, int fd, struct http *to, unsigned n, enum httptag tag, const char *fm)
http_seth(struct http *to, unsigned n, const char *fm)
{
assert(n < HTTP_HDR_MAX);
......@@ -689,11 +689,10 @@ http_seth(struct worker *w, int fd, struct http *to, unsigned n, enum httptag ta
to->hd[n].b = (void*)(uintptr_t)fm;
to->hd[n].e = (void*)(uintptr_t)strchr(fm, '\0');
to->hdf[n] = 0;
WSLH(w, tag, fd, to, n);
}
static void
http_copyh(struct worker *w, int fd, struct http *to, struct http *fm, unsigned n, enum httptag tag)
http_copyh(struct http *to, struct http *fm, unsigned n)
{
assert(n < HTTP_HDR_MAX);
......@@ -701,56 +700,56 @@ http_copyh(struct worker *w, int fd, struct http *to, struct http *fm, unsigned
to->hd[n].b = fm->hd[n].b;
to->hd[n].e = fm->hd[n].e;
to->hdf[n] = fm->hdf[n];
WSLH(w, tag, fd, to, n);
}
void
http_GetReq(struct worker *w, int fd, struct http *to, struct http *fm)
http_GetReq(struct http *to, struct http *fm)
{
CHECK_OBJ_NOTNULL(fm, HTTP_MAGIC);
CHECK_OBJ_NOTNULL(to, HTTP_MAGIC);
http_seth(w, fd, to, HTTP_HDR_REQ, HTTP_T_Request, "GET");
http_copyh(w, fd, to, fm, HTTP_HDR_URL, HTTP_T_URL);
http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, "HTTP/1.1");
http_seth(to, HTTP_HDR_REQ, "GET");
http_copyh(to, fm, HTTP_HDR_URL);
http_seth(to, HTTP_HDR_PROTO, "HTTP/1.1");
}
void
http_CopyReq(struct worker *w, int fd, struct http *to, struct http *fm)
http_CopyReq(struct http *to, struct http *fm)
{
CHECK_OBJ_NOTNULL(fm, HTTP_MAGIC);
CHECK_OBJ_NOTNULL(to, HTTP_MAGIC);
http_copyh(w, fd, to, fm, HTTP_HDR_REQ, HTTP_T_Request);
http_copyh(w, fd, to, fm, HTTP_HDR_URL, HTTP_T_URL);
http_copyh(to, fm, HTTP_HDR_REQ);
http_copyh(to, fm, HTTP_HDR_URL);
if (params->backend_http11)
http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, "HTTP/1.1");
http_seth(to, HTTP_HDR_PROTO, "HTTP/1.1");
else
http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol);
http_copyh(to, fm, HTTP_HDR_PROTO);
}
void
http_CopyResp(struct worker *w, int fd, struct http *to, struct http *fm)
http_CopyResp(struct http *to, struct http *fm)
{
CHECK_OBJ_NOTNULL(fm, HTTP_MAGIC);
CHECK_OBJ_NOTNULL(to, HTTP_MAGIC);
if (params->client_http11)
http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, "HTTP/1.1");
http_seth(to, HTTP_HDR_PROTO, "HTTP/1.1");
else
http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol);
http_copyh(w, fd, to, fm, HTTP_HDR_STATUS, HTTP_T_Status);
http_copyh(w, fd, to, fm, HTTP_HDR_RESPONSE, HTTP_T_Response);
http_copyh(to, fm, HTTP_HDR_PROTO);
http_copyh(to, fm, HTTP_HDR_STATUS);
http_copyh(to, fm, HTTP_HDR_RESPONSE);
}
void
http_SetResp(struct worker *w, int fd, struct http *to, const char *proto, const char *status, const char *response)
http_SetResp(struct http *to, const char *proto, const char *status, const char *response)
{
CHECK_OBJ_NOTNULL(to, HTTP_MAGIC);
http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, proto);
http_seth(w, fd, to, HTTP_HDR_STATUS, HTTP_T_Status, status);
http_seth(w, fd, to, HTTP_HDR_RESPONSE, HTTP_T_Response, response);
http_seth(to, HTTP_HDR_PROTO, proto);
http_seth(to, HTTP_HDR_STATUS, status);
http_seth(to, HTTP_HDR_RESPONSE, response);
}
static void
......@@ -764,7 +763,6 @@ http_copyheader(struct worker *w, int fd, struct http *to, struct http *fm, unsi
if (to->nhd < HTTP_HDR_MAX) {
to->hd[to->nhd].b = fm->hd[n].b;
to->hd[to->nhd].e = fm->hd[n].e;
WSLH(w, HTTP_T_Header, fd, to, to->nhd);
to->nhd++;
} else {
VSL_stats->losthdr++;
......@@ -800,7 +798,7 @@ http_FilterHeader(struct worker *w, int fd, struct http *to, struct http *fm, un
*/
void
http_CopyHome(struct http *hp)
http_CopyHome(struct worker *w, int fd, struct http *hp)
{
unsigned u, l;
char *p;
......@@ -808,6 +806,20 @@ http_CopyHome(struct http *hp)
for (u = 0; u < hp->nhd; u++) {
if (hp->hd[u].b == NULL)
continue;
switch (u) {
case HTTP_HDR_PROTO:
WSLH(w, HTTP_T_Protocol, fd, hp, u);
break;
case HTTP_HDR_STATUS:
WSLH(w, HTTP_T_Status, fd, hp, u);
break;
case HTTP_HDR_RESPONSE:
WSLH(w, HTTP_T_Response, fd, hp, u);
break;
default:
WSLH(w, HTTP_T_Header, fd, hp, u);
break;
}
if (hp->hd[u].b >= hp->ws->s && hp->hd[u].e <= hp->ws->e)
continue;
l = hp->hd[u].e - hp->hd[u].b;
......@@ -842,7 +854,7 @@ http_SetHeader(struct worker *w, int fd, struct http *to, const char *hdr)
WSL(w, http2shmlog(to, HTTP_T_LostHeader), fd, "%s", hdr);
return;
}
http_seth(w, fd, to, to->nhd++, HTTP_T_Header, hdr);
http_seth(to, to->nhd++, hdr);
}
/*--------------------------------------------------------------------*/
......@@ -867,8 +879,9 @@ void
http_PutProtocol(struct worker *w, int fd, struct http *to, const char *protocol)
{
(void)w; /* should be used to report losthdr */
(void)fd; /* should be used to report losthdr */
http_PutField(to, HTTP_HDR_PROTO, protocol);
WSLH(w, HTTP_T_Protocol, fd, to, HTTP_HDR_PROTO);
}
void
......@@ -876,18 +889,20 @@ http_PutStatus(struct worker *w, int fd, struct http *to, int status)
{
char stat[4];
(void)w; /* should be used to report losthdr */
(void)fd; /* should be used to report losthdr */
assert(status >= 0 && status <= 999);
sprintf(stat, "%d", status);
http_PutField(to, HTTP_HDR_STATUS, stat);
WSLH(w, HTTP_T_Status, fd, to, HTTP_HDR_STATUS);
}
void
http_PutResponse(struct worker *w, int fd, struct http *to, const char *response)
{
(void)w; /* should be used to report losthdr */
(void)fd; /* should be used to report losthdr */
http_PutField(to, HTTP_HDR_RESPONSE, response);
WSLH(w, HTTP_T_Response, fd, to, HTTP_HDR_RESPONSE);
}
void
......@@ -909,7 +924,6 @@ http_PrintfHeader(struct worker *w, int fd, struct http *to, const char *fmt, ..
to->hd[to->nhd].b = to->ws->f;
to->hd[to->nhd].e = to->ws->f + n;
WS_Release(to->ws, n + 1);
WSLH(w, HTTP_T_Header, fd, to, to->nhd);
to->nhd++;
}
}
......@@ -924,18 +938,25 @@ http_Write(struct worker *w, struct http *hp, int resp)
if (resp) {
AN(hp->hd[HTTP_HDR_STATUS].b);
l = WRK_WriteH(w, &hp->hd[HTTP_HDR_PROTO], " ");
WSLH(w, HTTP_T_Protocol, *w->wfd, hp, HTTP_HDR_PROTO);
l += WRK_WriteH(w, &hp->hd[HTTP_HDR_STATUS], " ");
WSLH(w, HTTP_T_Status, *w->wfd, hp, HTTP_HDR_STATUS);
l += WRK_WriteH(w, &hp->hd[HTTP_HDR_RESPONSE], "\r\n");
WSLH(w, HTTP_T_Response, *w->wfd, hp, HTTP_HDR_RESPONSE);
} else {
AN(hp->hd[HTTP_HDR_URL].b);
l = WRK_WriteH(w, &hp->hd[HTTP_HDR_REQ], " ");
WSLH(w, HTTP_T_Request, *w->wfd, hp, HTTP_HDR_REQ);
l += WRK_WriteH(w, &hp->hd[HTTP_HDR_URL], " ");
WSLH(w, HTTP_T_URL, *w->wfd, hp, HTTP_HDR_URL);
l += WRK_WriteH(w, &hp->hd[HTTP_HDR_PROTO], "\r\n");
WSLH(w, HTTP_T_Protocol, *w->wfd, hp, HTTP_HDR_PROTO);
}
for (u = HTTP_HDR_FIRST; u < hp->nhd; u++) {
AN(hp->hd[u].b);
AN(hp->hd[u].e);
l += WRK_WriteH(w, &hp->hd[u], "\r\n");
WSLH(w, HTTP_T_Header, *w->wfd, hp, u);
}
l += WRK_Write(w, "\r\n", -1);
return (l);
......
......@@ -73,7 +73,7 @@ res_do_304(struct sess *sp)
http_ClrHeader(sp->http);
sp->http->logtag = HTTP_Tx;
http_SetResp(sp->wrk, sp->fd, sp->http,
http_SetResp(sp->http,
"HTTP/1.1", "304", "Not Modified");
TIM_format(sp->t_req.tv_sec, lm);
http_PrintfHeader(sp->wrk, sp->fd, sp->http, "Date: %s", lm);
......@@ -129,7 +129,7 @@ RES_WriteObj(struct sess *sp)
http_ClrHeader(sp->http);
sp->http->logtag = HTTP_Tx;
http_CopyResp(sp->wrk, sp->fd, sp->http, &sp->obj->http);
http_CopyResp(sp->http, &sp->obj->http);
http_FilterHeader(sp->wrk, sp->fd, sp->http, &sp->obj->http, HTTPH_A_DELIVER);
if (sp->xid != sp->obj->xid)
http_PrintfHeader(sp->wrk, sp->fd, sp->http,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment