Commit f7640fe5 authored by Geoff Simmons's avatar Geoff Simmons

vdp.args() may be call in vcl_deliver to set CLI args at request time.

parent 4a149499
......@@ -63,6 +63,51 @@ Ravz cre npphzfna, nhthr vq znrpranf ovoraqhz hyynzpbecre va srezraghz, cyngrn s
server s1 -wait
server s1 -start
varnish v1 -vcl+backend {
import ${vmod_pipe};
sub vcl_init {
new tr = pipe.vdp(path="${tr}");
}
sub vcl_backend_response {
set beresp.uncacheable = true;
}
sub vcl_deliver {
# leet
tr.arg("aAbBcCeEgGiIlLoOqQsStTzZ");
tr.arg("4488((3396ll110099557722");
set resp.filters = "tr";
}
}
client c1 {
txreq
rxresp
expect resp.status == 200
expect resp.body == "f00 84r 842 9uux"
txreq
rxresp
expect resp.status == 200
expect resp.body == {M4n l5 dl57ln9ul5h3d, n07 0n1y 8y hl5 r3450n, 8u7 8y 7hl5 5ln9u14r p455l0n fr0m 07h3r 4nlm415, whl(h l5 4 1u57 0f 7h3 mlnd, 7h47 8y 4 p3r53v3r4n(3 0f d31l9h7 ln 7h3 (0n7lnu3d 4nd lnd3f47l94813 93n3r47l0n 0f kn0w13d93, 3x(33d5 7h3 5h0r7 v3h3m3n(3 0f 4ny (4rn41 p1345ur3.}
txreq
rxresp
expect resp.status == 200
expect resp.body == {10r3m lp5um d010r 5l7 4m37, 130 0rn4r3 nu114, 3u m4135u4d4. (r45 7urpl5 pr37lum (0n53(737u3r m4url5 urn4 50d4135, 41l9u37 m0r8l m4135u4d4 p073n7l v31l7 h3ndr3rl7, u7 rh0n(u5 10r3m vl743 n39u3 53d, f3u9l47 n3( 7311u5 9r4vld4 m49n4 5l7. Pr37lum 4( m4554 4r(u vlv3rr4, dl4m v31l7 ln 41l9u4 4dlpl5(ln9 v3hl(u14, 41l9u37 l4(u1l5 4 1080r7l5 3nlm 5l7, 1l9u14 nl51 u17rl(l35, m49n4 v01u7p47 3r05 5u5p3ndl553 m4554. U7 m4url5, puru5 ml 4r(u f4u(l8u5 pr37lum 31l7. Pu1vln4r 3nlm 3u, 37 0r(l 130 70r70r p4r7url3n7 m49n4, (0mm0d0 u7 p3113n7359u3, ju570 10r3m v357l8u1um n0n 14(lnl4 0dl0. (0n539u47ur dl4m v01u7p47.
14(u5 d0n3( 1l83r0 v3n3n47l5 v3n3n47l5, 3935745 pr37lum u7 urn4 v3hl(u14, 4( 3937 4(, 4m37 m43(3n45 7urpl5 vlv3rr4 814ndl7. U114m(0rp3r m4554 53d ln, n3( v31l7 n3( 43n34n ju570, nu114m (r45, u114m(0rp3r 3r05 ph4r37r4 m49n4 urn4 m37u5, u17rl(l35 ru7rum n39u3 nun( 313lf3nd. Pr37lum (0n539u47 130 ln, 4m37 v4rlu5 ln7393r, 3r05 n0n 37 u7 5l7 4(, m49nl5 9ul5 nl8h d010r 0rn4r3 53d. 7urpl5 n3( m0r8l, nun( 4 m4url5 f4u(l8u5 m01357l3, d010r v31l7 7ln(ldun7, 4m37 4( 3r47 3r05 m4554 p3d3. Vl743 v3n3n47l5 v01u7p47 3937 v357l8u1um. ln n4m ph4r37r4 ln vlv4mu5 pr37lum, nu114 nun( 50(l059u, 41l9u4m nu114m 1l9u14, u7 53d v357l8u1um 9u4m m0r8l 7urpl5 m477l5, wl5l 47 p3r 10r3m 41l9u4m 4n73 53d. M4url5 74(l7l 1l9u14 v3n3n47l5 v3hl(u14, m0r8l 3937 n3(. 4m37 ld 50d4135 305, dl4m 5u5p3ndl553 pu1vln4r, 47 v357l8u1um 70r9u3n7 n3( 3937 rl5u5 357. M4url5 54pl3n 70r70r 3937 n35(lun7.
Rldl(u1u5 (0n9u3 3r47 v31l7, nu114 f31l5, vlv3rr4 n0n 73mp0r (um nu114, 9ul5 9ul59u3 3nlm 47 50(l059u v357l8u1um 5l7. D0n3( m01357l3. (ur5u5 pr37lum d0n3( ph45311u5 14(lnl4 v31l7 nu114, 9ul5 54pl3n d4pl8u5 5u5(lpl7 vlv3rr4 m49nl (0mm0d0, vlv3rr4 v31 3r05 13(7u5 7rl57l9u3 10r3m vlv4mu5. 70r70r ml 4n73, 4u7 31l7, m37u5 4n73 v01up7473m nl51 43n34n 3937 4m37, f31l5 47 37. P05u3r3 10r3m rldl(u1u5, 37 130 vlv3rr4 p3113n7359u3 n39u3, u114m(0rp3r n39u3 v01u7p47 pr37lum 4m37 140r337. 54pl3n 47, ph45311u5 u114m(0 wl5l, 4r(u f3rm3n7um frln9l114 n4m 7urpl5 ml. (0n9u3 37 d0n3( ru7rum, v01up7473m 37 dul5 n39u3 3937 31l7. Mu5 5l7 1u(7u5 357, nu114m frln9l114 m49n4 v31 m4554, vlv4mu5 v31 4dlpl5(ln9 9ul5 d010r 9u4m. Rl5u5 140r337 (0n539u47 fu5(3 5u5p3ndl553 vl743, f31l5 41l9u37.
3nlm p3r 4((um54n, 4u9u3 ld m43(3n45 8l83ndum u114m(0rp3r ln f3rm3n7um, p14734 f3rm3n7um. (0nv411l5 pu1vln4r 70r70r 3r05 5l7 (r45 n45(37ur, 9u4m dl5 31l7 53d 41l9u4m 4(, nu114 m0r8l 5u5(lpl7 3935745 p14(3r47 pr37lum. V3hl(u14 313m3n7um dul5, 7urpl5 wl5l n45(37ur v31l7. 53n3(7u5 43n34n lp5um 814ndl7, 313lf3nd 130 d0n3( nun(, u7 v31 549l77l5 53d n4m, u7 41l9u4m 9u4m 41l9u4m 47 7311u5. Vlv4mu5 d0n3( 1l83r0 f3u9l47 4m37 9r4vld4, f31l5 ld 41l9u4m nu114m (0n539u47, 4u7 3937 5u5p3ndl553 ru7rum ln. 0r(l 7311u5. 4 54pl3n 5(313rl59u3 dl4m, 0rn4r3 140r337 1080r7l5 814ndl7 ln. 41l9u4m 47 5u5(lpl7, ld rl5u5. 130 14(u5 9u4m m011l5 3r47 m0r8l v31, u7 4dlpl5(ln9 (l11um dul. 31l7 8l83ndum 7rl57l9u3 37 n0n 3r05 1l83r0, 3935745 13(7u5 7urpl5, 9ul5 9r4vld4 d010r v01u7p47, puru5 3u, (0n53(737u3r ph4r37r4 p3r v3hl(u14 9u4m 7311u5.}
} -run
server s1 -wait
server s1 -start
varnish v1 -vcl+backend {
import ${vmod_pipe};
......@@ -104,10 +149,56 @@ Ridiculus congue erAt velit, nullA felis, viverrA non tempor cum nullA, quis qui
Enim per AccumsAn, Augue id mAecenAs bibendum ullAmcorper in fermentum, plAteA fermentum. ConvAllis pulvinAr tortor eros sit crAs nAscetur, quAm dis elit sed AliquAm Ac, nullA morbi suscipit egestAs plAcerAt pretium. VehiculA elementum duis, turpis wisi nAscetur velit. Senectus AeneAn ipsum blAndit, eleifend leo donec nunc, ut vel sAgittis sed nAm, ut AliquAm quAm AliquAm At tellus. VivAmus donec libero feugiAt Amet grAvidA, felis id AliquAm nullAm consequAt, Aut eget suspendisse rutrum in. Orci tellus. A sApien scelerisque diAm, ornAre lAoreet lobortis blAndit in. AliquAm At suscipit, id risus. Leo lAcus quAm mollis erAt morbi vel, ut Adipiscing cillum dui. Elit bibendum tristique et non eros libero, egestAs lectus turpis, quis grAvidA dolor volutpAt, purus eu, consectetuer phAretrA per vehiculA quAm tellus.}
} -run
server s1 -wait
server s1 -start
varnish v1 -vcl+backend {
import ${vmod_pipe};
sub vcl_init {
new sed = pipe.vdp(path="${sed}");
}
sub vcl_backend_response {
set beresp.uncacheable = true;
}
sub vcl_deliver {
sed.arg("-e");
sed.arg("s/o/O/g");
set resp.filters = "sed";
}
}
client c1 {
txreq
rxresp
expect resp.status == 200
expect resp.body == "fOO bar baz quux"
txreq
rxresp
expect resp.status == 200
expect resp.body == {Man is distinguished, nOt Only by his reasOn, but by this singular passiOn frOm Other animals, which is a lust Of the mind, that by a perseverance Of delight in the cOntinued and indefatigable generatiOn Of knOwledge, exceeds the shOrt vehemence Of any carnal pleasure.}
txreq
rxresp
expect resp.status == 200
expect resp.body == {LOrem ipsum dOlOr sit amet, leO Ornare nulla, eu malesuada. Cras turpis pretium cOnsectetuer mauris urna sOdales, aliquet mOrbi malesuada pOtenti velit hendrerit, ut rhOncus lOrem vitae neque sed, feugiat nec tellus gravida magna sit. Pretium ac massa arcu viverra, diam velit in aliqua adipiscing vehicula, aliquet iaculis a lObOrtis enim sit, ligula nisl ultricies, magna vOlutpat erOs suspendisse massa. Ut mauris, purus mi arcu faucibus pretium elit. Pulvinar enim eu, et Orci leO tOrtOr parturient magna, cOmmOdO ut pellentesque, justO lOrem vestibulum nOn lacinia OdiO. COnsequatur diam vOlutpat.
Lacus dOnec liberO venenatis venenatis, egestas pretium ut urna vehicula, ac eget ac, amet maecenas turpis viverra blandit. UllamcOrper massa sed in, nec velit nec aenean justO, nullam cras, ullamcOrper erOs pharetra magna urna metus, ultricies rutrum neque nunc eleifend. Pretium cOnsequat leO in, amet varius integer, erOs nOn et ut sit ac, magnis quis nibh dOlOr Ornare sed. Turpis nec mOrbi, nunc a mauris faucibus mOlestie, dOlOr velit tincidunt, amet ac erat erOs massa pede. Vitae venenatis vOlutpat eget vestibulum. In nam pharetra in vivamus pretium, nulla nunc sOciOsqu, aliquam nullam ligula, ut sed vestibulum quam mOrbi turpis mattis, wisi at per lOrem aliquam ante sed. Mauris taciti ligula venenatis vehicula, mOrbi eget nec. Amet id sOdales eOs, diam suspendisse pulvinar, at vestibulum tOrquent nec eget risus est. Mauris sapien tOrtOr eget nesciunt.
Ridiculus cOngue erat velit, nulla felis, viverra nOn tempOr cum nulla, quis quisque enim at sOciOsqu vestibulum sit. DOnec mOlestie. Cursus pretium dOnec phasellus lacinia velit nulla, quis sapien dapibus suscipit viverra magni cOmmOdO, viverra vel erOs lectus tristique lOrem vivamus. TOrtOr mi ante, aut elit, metus ante vOluptatem nisl aenean eget amet, felis at et. POsuere lOrem ridiculus, et leO viverra pellentesque neque, ullamcOrper neque vOlutpat pretium amet laOreet. Sapien at, phasellus ullamcO wisi, arcu fermentum fringilla nam turpis mi. COngue et dOnec rutrum, vOluptatem et duis neque eget elit. Mus sit luctus est, nullam fringilla magna vel massa, vivamus vel adipiscing quis dOlOr quam. Risus laOreet cOnsequat fusce suspendisse vitae, felis aliquet.
Enim per accumsan, augue id maecenas bibendum ullamcOrper in fermentum, platea fermentum. COnvallis pulvinar tOrtOr erOs sit cras nascetur, quam dis elit sed aliquam ac, nulla mOrbi suscipit egestas placerat pretium. Vehicula elementum duis, turpis wisi nascetur velit. Senectus aenean ipsum blandit, eleifend leO dOnec nunc, ut vel sagittis sed nam, ut aliquam quam aliquam at tellus. Vivamus dOnec liberO feugiat amet gravida, felis id aliquam nullam cOnsequat, aut eget suspendisse rutrum in. Orci tellus. A sapien scelerisque diam, Ornare laOreet lObOrtis blandit in. Aliquam at suscipit, id risus. LeO lacus quam mOllis erat mOrbi vel, ut adipiscing cillum dui. Elit bibendum tristique et nOn erOs liberO, egestas lectus turpis, quis gravida dOlOr vOlutpat, purus eu, cOnsectetuer pharetra per vehicula quam tellus.}
} -run
varnish v1 -vcl { backend b None; }
# Tests oject finalization, freeing argv
varnish v1 -cli "vcl.discard vcl1"
varnish v1 -cli "vcl.discard vcl2"
varnish v1 -cli "vcl.discard vcl3"
varnish v1 -cli "vcl.discard vcl4"
delay 1
varnish v1 -cli "vcl.list"
......@@ -42,6 +42,7 @@
#include "cache/cache.h"
#include "cache/cache_filter.h"
#include "vcl.h"
#include "vtree.h"
#include "vcc_if.h"
......@@ -118,6 +119,13 @@ static const char *stream_name[] = {
[STDERR_FILENO] = "stderr",
};
struct task_cfg {
unsigned magic;
#define PIPE_TASK_MAGIC 0x43294c37
char **argv;
int argc;
};
/* VDP */
static inline int
......@@ -152,6 +160,10 @@ vdp_init(struct req *req, void **priv)
struct vdp_map map_entry, *map;
struct VPFX(pipe_vdp) *obj;
int in[2], out[2], err[2];
struct vrt_ctx fake_ctx[1];
struct vmod_priv *task_priv;
struct task_cfg *task;
char **argv;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->vdc, VDP_CTX_MAGIC);
......@@ -191,6 +203,21 @@ vdp_init(struct req *req, void **priv)
state->fds[STDOUT_FILENO].events = POLLIN;
state->fds[STDERR_FILENO].events = POLLOUT;
argv = obj->argv;
/* Hackishly using non-API knowledge of VRT_priv_task() */
INIT_OBJ(fake_ctx, VRT_CTX_MAGIC);
fake_ctx->req = req;
fake_ctx->ws = req->ws;
task_priv = VRT_priv_task(fake_ctx, obj);
AN(priv);
if (task_priv->priv != NULL) {
WS_Assert_Allocated(fake_ctx->ws, task_priv->priv,
sizeof(*task));
CAST_OBJ_NOTNULL(task, task_priv->priv, PIPE_TASK_MAGIC);
if (task->argv != NULL)
argv = task->argv;
}
if (mk_pipe(in, obj->name, req->vsl) != 0)
return (-1);
if (mk_pipe(out, obj->name, req->vsl) != 0)
......@@ -222,7 +249,7 @@ vdp_init(struct req *req, void **priv)
exit(EXIT_FAILURE);
errno = 0;
if (execve(obj->path, obj->argv, envp) == -1) {
if (execve(obj->path, argv, envp) == -1) {
VSLb(req->vsl, SLT_Error, "vdfp_pipe: vdp %s: cannot "
"exec %s: %s", obj->name, obj->path,
vstrerror(errno));
......@@ -621,28 +648,97 @@ vmod_vdp__fini(struct VPFX(pipe_vdp) **vdpp)
FREE_OBJ(vdp_obj);
}
/* XXX currently only for vcl_init */
static void
task_free(void *p)
{
struct task_cfg *task;
CAST_OBJ_NOTNULL(task, p, PIPE_TASK_MAGIC);
if (task->argv != NULL) {
for (int i = 1; task->argv[i] != NULL; i++)
free(task->argv[i]);
free(task->argv);
}
}
VCL_VOID
vmod_vdp_arg(VRT_CTX, struct VPFX(pipe_vdp) *obj, VCL_STRING arg)
{
struct vmod_priv *priv;
struct task_cfg *task;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(ctx->ws, WS_MAGIC);
CHECK_OBJ_NOTNULL(obj, PIPE_VDP_MAGIC);
if (!(ctx->method & (VCL_MET_INIT | VCL_MET_DELIVER))) {
VDPFAIL(ctx, "%s.arg(): may only be callled in vcl_init or "
"vcl_deliver", obj->name);
return;
}
if (arg == NULL) {
VDPFAIL(ctx, "%s.arg(): arg is NULL", obj->name);
return;
}
if (ctx->method & VCL_MET_INIT) {
errno = 0;
obj->argv = realloc(obj->argv,
(obj->argc + 2) * sizeof(*obj->argv));
if (obj->argv == NULL) {
VDPFAIL(ctx, "%s.arg(): cannot re-allocate argv: %s",
obj->name, vstrerror(errno));
return;
}
obj->argv[obj->argc] = strdup(arg);
obj->argv[obj->argc + 1] = NULL;
obj->argc++;
return;
}
AN(ctx->method & VCL_MET_DELIVER);
priv = VRT_priv_task(ctx, obj);
AN(priv);
if (priv->priv == NULL) {
if ((priv->priv = WS_Alloc(ctx->ws, sizeof(*task))) == NULL) {
VDPFAIL(ctx, "%s.arg(): cannot allocate task config",
obj->name);
return;
}
task = (struct task_cfg *)priv->priv;
errno = 0;
task->argv = malloc(3 * sizeof(*task->argv));
if (task->argv == NULL) {
VDPFAIL(ctx, "%s.arg(): cannot allocate argv: %s",
obj->name, vstrerror(errno));
return;
}
task->argv[0] = obj->path;
task->argv[1] = strdup(arg);
task->argv[2] = NULL;
task->argc = 2;
task->magic = PIPE_TASK_MAGIC;
priv->len = sizeof(*task);
priv->free = task_free;
return;
}
WS_Assert_Allocated(ctx->ws, priv->priv, sizeof(*task));
CAST_OBJ_NOTNULL(task, priv->priv, PIPE_TASK_MAGIC);
errno = 0;
obj->argv = realloc(obj->argv, (obj->argc + 2) * sizeof(*obj->argv));
if (obj->argv == NULL) {
VDPFAIL(ctx, "%s.arg(): cannot re-allocate argv: %s",
obj->name, vstrerror(errno));
task->argv = realloc(task->argv,
(task->argc + 2) * sizeof(*task->argv));
if (task->argv == NULL) {
VDPFAIL(ctx, "%s.arg(): cannot re-allocate argv: %s", obj->name,
vstrerror(errno));
return;
}
obj->argv[obj->argc] = strdup(arg);
obj->argv[obj->argc + 1] = NULL;
obj->argc++;
task->argv[task->argc] = strdup(arg);
task->argv[task->argc + 1] = NULL;
task->argc++;
return;
}
......
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