[master] 1632279 Start moving ESI delivery towards the VDP pipeline
Poul-Henning Kamp
phk at FreeBSD.org
Tue Oct 21 22:25:03 CEST 2014
commit 163227929bba82804e3a34ed070766d2a0fc4a42
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Oct 21 20:24:44 2014 +0000
Start moving ESI delivery towards the VDP pipeline
diff --git a/bin/varnishd/cache/cache_esi_deliver.c b/bin/varnishd/cache/cache_esi_deliver.c
index 030ccbf..ba72bb7 100644
--- a/bin/varnishd/cache/cache_esi_deliver.c
+++ b/bin/varnishd/cache/cache_esi_deliver.c
@@ -205,7 +205,7 @@ ved_decode_len(uint8_t **pp)
* the stream with a bit more overhead.
*/
-static void
+static int
ved_pretend_gzip(struct req *req, const uint8_t *p, ssize_t l)
{
uint8_t buf1[5], buf2[5];
@@ -219,24 +219,25 @@ ved_pretend_gzip(struct req *req, const uint8_t *p, ssize_t l)
while (l > 0) {
if (l >= 65535) {
lx = 65535;
- req->resp_bodybytes +=
- WRW_Write(req->wrk, buf1, sizeof buf1);
+ if (VDP_bytes(req, VDP_NULL, buf1, sizeof buf1))
+ return (-1);
} else {
lx = (uint16_t)l;
buf2[0] = 0;
vle16enc(buf2 + 1, lx);
vle16enc(buf2 + 3, ~lx);
- req->resp_bodybytes +=
- WRW_Write(req->wrk, buf2, sizeof buf2);
+ if (VDP_bytes(req, VDP_NULL, buf2, sizeof buf2))
+ return (-1);
}
- req->resp_bodybytes += WRW_Write(req->wrk, p, lx);
+ if (VDP_bytes(req, VDP_NULL, p, lx))
+ return (-1);
req->crc = crc32(req->crc, p, lx);
req->l_crc += lx;
l -= lx;
p += lx;
}
/* buf2 is local, have to flush */
- (void)WRW_Flush(req->wrk);
+ return (VDP_bytes(req, VDP_FLUSH, NULL, 0));
}
/*---------------------------------------------------------------------
@@ -289,8 +290,7 @@ ESI_Deliver(struct req *req)
if (isgzip && !(req->res_mode & RES_GUNZIP)) {
assert(sizeof gzip_hdr == 10);
/* Send out the gzip header */
- req->resp_bodybytes +=
- WRW_Write(req->wrk, gzip_hdr, 10);
+ (void)VDP_bytes(req, VDP_NULL, gzip_hdr, 10);
req->l_crc = 0;
req->gzip_resp = 1;
req->crc = crc32(0L, Z_NULL, 0);
@@ -349,14 +349,13 @@ ESI_Deliver(struct req *req)
* We have a gzip'ed VEC and delivers
* a gzip'ed ESI response.
*/
- req->resp_bodybytes +=
- WRW_Write(req->wrk, pp, l2);
+ (void)VDP_bytes(req, VDP_NULL, pp, l2);
} else if (req->gzip_resp) {
/*
* A gzip'ed ESI response, but the VEC
* was not gzip'ed.
*/
- ved_pretend_gzip(req, pp, l2);
+ (void)ved_pretend_gzip(req, pp, l2);
} else if (isgzip) {
/*
* A gzip'ed VEC, but ungzip'ed ESI
@@ -375,8 +374,7 @@ ESI_Deliver(struct req *req)
/*
* Ungzip'ed VEC, ungzip'ed ESI response
*/
- req->resp_bodybytes +=
- WRW_Write(req->wrk, pp, l2);
+ (void)VDP_bytes(req, VDP_NULL, pp, l2);
}
pp += l2;
if (sl == 0) {
@@ -421,7 +419,7 @@ ESI_Deliver(struct req *req)
AN(r);
if (vgz != NULL)
VGZ_WrwFlush(req, vgz);
- if (WRW_Flush(req->wrk)) {
+ if (VDP_bytes(req, VDP_FLUSH, NULL, 0)) {
SES_Close(req->sp, SC_REM_CLOSE);
p = e;
break;
@@ -454,9 +452,9 @@ ESI_Deliver(struct req *req)
/* MOD(2^32) length */
vle32enc(tailbuf + 9, req->l_crc);
- req->resp_bodybytes += WRW_Write(req->wrk, tailbuf, 13);
+ (void)VDP_bytes(req, VDP_NULL, tailbuf, 13);
}
- (void)WRW_Flush(req->wrk);
+ (void)VDP_bytes(req, VDP_FLUSH, NULL, 0);
ObjIterEnd(req->objcore, &oi);
}
@@ -488,8 +486,8 @@ ESI_DeliverChild(struct req *req)
oi = ObjIterBegin(req->wrk, req->objcore);
do {
ois = ObjIter(req->objcore, oi, &sp, &sl);
- if (sl > 0)
- ved_pretend_gzip(req, sp, sl);
+ if (sl > 0 && ved_pretend_gzip(req, sp, sl))
+ break;
} while (ois == OIS_DATA || ois == OIS_STREAM);
ObjIterEnd(req->objcore, &oi);
return;
@@ -547,8 +545,8 @@ ESI_DeliverChild(struct req *req)
if (dl > 0) {
if (dl > sl)
dl = sl;
- req->resp_bodybytes +=
- WRW_Write(req->wrk, pp, dl);
+ if (VDP_bytes(req, VDP_NULL, pp, dl))
+ break;
ll += dl;
sl -= dl;
pp += dl;
@@ -558,7 +556,8 @@ ESI_DeliverChild(struct req *req)
/* Remove the "LAST" bit */
dbits[0] = *pp;
dbits[0] &= ~(1U << (last & 7));
- req->resp_bodybytes += WRW_Write(req->wrk, dbits, 1);
+ if (VDP_bytes(req, VDP_NULL, dbits, 1))
+ break;
ll++;
sl--;
pp++;
@@ -569,8 +568,8 @@ ESI_DeliverChild(struct req *req)
if (dl > 0) {
if (dl > sl)
dl = sl;
- req->resp_bodybytes +=
- WRW_Write(req->wrk, pp, dl);
+ if (VDP_bytes(req, VDP_NULL, pp, dl))
+ break;
ll += dl;
sl -= dl;
pp += dl;
@@ -631,8 +630,8 @@ ESI_DeliverChild(struct req *req)
default:
WRONG("compiler must be broken");
}
- req->resp_bodybytes +=
- WRW_Write(req->wrk, dbits + 1, lpad);
+ if (VDP_bytes(req, VDP_NULL, dbits + 1, lpad))
+ break;
}
if (sl > 0) {
/* Recover GZIP tail */
More information about the varnish-commit
mailing list