Commit da6568c4 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make it possible for VDP filters to report partial processing.

(Also changes forgotten in previous commit)
parent 30be1c80
...@@ -83,8 +83,9 @@ VDP_bytes(struct vdp_ctx *vdx, enum vdp_action act, const void *ptr, ssize_t len ...@@ -83,8 +83,9 @@ VDP_bytes(struct vdp_ctx *vdx, enum vdp_action act, const void *ptr, ssize_t len
/* Call the present layer, while pointing to the next layer down */ /* Call the present layer, while pointing to the next layer down */
vdx->nxt = VTAILQ_NEXT(vdpe, list); vdx->nxt = VTAILQ_NEXT(vdpe, list);
vdpe->calls++; vdpe->calls++;
vdpe->bytes_in += len; vdx->bytes_done = len;
retval = vdpe->vdp->bytes(vdx, act, &vdpe->priv, ptr, len); retval = vdpe->vdp->bytes(vdx, act, &vdpe->priv, ptr, len);
vdpe->bytes_in += vdx->bytes_done;
if (retval && (vdx->retval == 0 || retval < vdx->retval)) if (retval && (vdx->retval == 0 || retval < vdx->retval))
vdx->retval = retval; /* Latch error value */ vdx->retval = retval; /* Latch error value */
vdx->nxt = vdpe; vdx->nxt = vdpe;
......
...@@ -140,6 +140,7 @@ struct vdp_ctx { ...@@ -140,6 +140,7 @@ struct vdp_ctx {
unsigned magic; unsigned magic;
#define VDP_CTX_MAGIC 0xee501df7 #define VDP_CTX_MAGIC 0xee501df7
int retval; int retval;
uint64_t bytes_done;
struct vdp_entry_s vdp; struct vdp_entry_s vdp;
struct vdp_entry *nxt; struct vdp_entry *nxt;
struct worker *wrk; struct worker *wrk;
......
...@@ -106,7 +106,6 @@ h2_bytes(struct vdp_ctx *vdx, enum vdp_action act, void **priv, ...@@ -106,7 +106,6 @@ h2_bytes(struct vdp_ctx *vdx, enum vdp_action act, void **priv,
struct h2_req *r2; struct h2_req *r2;
CHECK_OBJ_NOTNULL(vdx, VDP_CTX_MAGIC); CHECK_OBJ_NOTNULL(vdx, VDP_CTX_MAGIC);
CHECK_OBJ_NOTNULL(vdx->req, REQ_MAGIC);
CAST_OBJ_NOTNULL(r2, *priv, H2_REQ_MAGIC); CAST_OBJ_NOTNULL(r2, *priv, H2_REQ_MAGIC);
(void)act; (void)act;
...@@ -115,8 +114,8 @@ h2_bytes(struct vdp_ctx *vdx, enum vdp_action act, void **priv, ...@@ -115,8 +114,8 @@ h2_bytes(struct vdp_ctx *vdx, enum vdp_action act, void **priv,
if (len == 0) if (len == 0)
return (0); return (0);
H2_Send_Get(vdx->wrk, r2->h2sess, r2); H2_Send_Get(vdx->wrk, r2->h2sess, r2);
H2_Send(vdx->wrk, r2, H2_F_DATA, H2FF_NONE, len, ptr, vdx->bytes_done = 0;
&vdx->req->acct.resp_bodybytes); H2_Send(vdx->wrk, r2, H2_F_DATA, H2FF_NONE, len, ptr, &vdx->bytes_done);
H2_Send_Rel(r2->h2sess, r2); H2_Send_Rel(r2->h2sess, r2);
return (0); return (0);
} }
...@@ -332,5 +331,5 @@ h2_deliver(struct req *req, struct boc *boc, int sendbody) ...@@ -332,5 +331,5 @@ h2_deliver(struct req *req, struct boc *boc, int sendbody)
} }
AZ(req->wrk->v1l); AZ(req->wrk->v1l);
(void)VDP_Close(req); req->acct.resp_bodybytes += VDP_Close(req);
} }
...@@ -19,7 +19,7 @@ varnish v1 -arg "-p workspace_client=9k" -proto PROXY -vcl+backend { ...@@ -19,7 +19,7 @@ varnish v1 -arg "-p workspace_client=9k" -proto PROXY -vcl+backend {
} -start } -start
client c1 { client c1 {
send "PROXY TCP4 127.0.0.1 127.0.0.1 1111 2222\r\nGET /AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.1\r\n\r\n" send "PROXY TCP4 127.0.0.1 127.0.0.1 1111 2222\r\nGET /AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.1\r\n\r\n"
rxresp rxresp
} -run } -run
...@@ -65,6 +65,6 @@ client c2 { ...@@ -65,6 +65,6 @@ client c2 {
} -run } -run
client c3 { client c3 {
send "PROXY TCP4 127.0.0.1 127.0.0.1 1111 2222\r\nGET /CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC HTTP/1.1\r\n\r\n" send "PROXY TCP4 127.0.0.1 127.0.0.1 1111 2222\r\nGET /CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC HTTP/1.1\r\n\r\n"
rxresp rxresp
} -run } -run
...@@ -52,6 +52,8 @@ ...@@ -52,6 +52,8 @@
* Whenever something is deleted or changed in a way which is not * Whenever something is deleted or changed in a way which is not
* binary/load-time compatible, increment MAJOR version * binary/load-time compatible, increment MAJOR version
* *
* 13.0 (2020-03-15)
* Calling convention for VDP implementation changed
* 12.0 (2020-09-15) * 12.0 (2020-09-15)
* Added VRT_DirectorResolve() * Added VRT_DirectorResolve()
* Added VCL_STRING VRT_BLOB_string(VRT_CTX, VCL_BLOB) * Added VCL_STRING VRT_BLOB_string(VRT_CTX, VCL_BLOB)
...@@ -166,7 +168,7 @@ ...@@ -166,7 +168,7 @@
* vrt_acl type added * vrt_acl type added
*/ */
#define VRT_MAJOR_VERSION 12U #define VRT_MAJOR_VERSION 13U
#define VRT_MINOR_VERSION 0U #define VRT_MINOR_VERSION 0U
......
...@@ -111,17 +111,18 @@ xyzzy_rot13_init(struct req *req, void **priv) ...@@ -111,17 +111,18 @@ xyzzy_rot13_init(struct req *req, void **priv)
} }
static int v_matchproto_(vdp_bytes_f) static int v_matchproto_(vdp_bytes_f)
xyzzy_rot13_bytes(struct req *req, enum vdp_action act, void **priv, xyzzy_rot13_bytes(struct vdp_ctx *vdx, enum vdp_action act, void **priv,
const void *ptr, ssize_t len) const void *ptr, ssize_t len)
{ {
char *q; char *q;
const char *pp; const char *pp;
int i, j, retval = 0; int i, j, retval = 0;
CHECK_OBJ_NOTNULL(vdx, VDP_CTX_MAGIC);
AN(priv); AN(priv);
AN(*priv); AN(*priv);
if (len <= 0) if (len <= 0)
return (VDP_bytes(req, act, ptr, len)); return (VDP_bytes(vdx, act, ptr, len));
AN(ptr); AN(ptr);
if (act != VDP_END) if (act != VDP_END)
act = VDP_FLUSH; act = VDP_FLUSH;
...@@ -136,14 +137,14 @@ xyzzy_rot13_bytes(struct req *req, enum vdp_action act, void **priv, ...@@ -136,14 +137,14 @@ xyzzy_rot13_bytes(struct req *req, enum vdp_action act, void **priv,
else else
q[i] = pp[j]; q[i] = pp[j];
if (i == ROT13_BUFSZ - 1) { if (i == ROT13_BUFSZ - 1) {
retval = VDP_bytes(req, act, q, ROT13_BUFSZ); retval = VDP_bytes(vdx, act, q, ROT13_BUFSZ);
if (retval != 0) if (retval != 0)
return (retval); return (retval);
i = -1; i = -1;
} }
} }
if (i >= 0) if (i >= 0)
retval = VDP_bytes(req, act, q, i + 1L); retval = VDP_bytes(vdx, act, q, i + 1L);
return (retval); return (retval);
} }
......
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