Commit 2e3b542d authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Make the VRT_[GS]etHdr() take vrt_ctx arg.

parent 8a3dfdf3
......@@ -376,7 +376,7 @@ vcl_call_method(struct worker *wrk, struct req *req, struct busyobj *bo,
struct ws *ws, unsigned method, vcl_func_f *func)
{
char *aws;
struct vsl_log *vsl;
struct vsl_log *vsl = NULL;
struct vrt_ctx ctx;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
......@@ -389,14 +389,11 @@ vcl_call_method(struct worker *wrk, struct req *req, struct busyobj *bo,
vsl = req->vsl;
ctx.vsl = vsl;
ctx.vcl = req->vcl;
} else {
AZ(req);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
vsl = bo->vsl;
ctx.vsl = vsl;
ctx.vcl = bo->vcl;
ctx.http_req = req->http;
ctx.http_resp = req->resp;
if (req->obj)
ctx.http_obj = req->obj->http;
}
ctx.ws = ws;
if (method == VCL_MET_BACKEND_FETCH ||
method == VCL_MET_PASS ||
method == VCL_MET_MISS ||
......@@ -407,9 +404,20 @@ vcl_call_method(struct worker *wrk, struct req *req, struct busyobj *bo,
bo = req->busyobj;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
}
if (bo != NULL) {
// AZ(req);
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
vsl = bo->vsl;
ctx.vsl = vsl;
ctx.vcl = bo->vcl;
ctx.http_bereq = bo->bereq;
ctx.http_beresp = bo->beresp;
}
ctx.ws = ws;
aws = WS_Snapshot(wrk->aws);
wrk->handling = 0;
wrk->cur_method = method;
AN(vsl);
VSLb(vsl, SLT_VCL_call, "%s", VCL_Method_Name(method));
(void)func(&ctx, wrk, req, bo, ws);
VSLb(vsl, SLT_VCL_return, "%s", VCL_Return_Name(wrk->handling));
......
......@@ -107,43 +107,42 @@ VRT_acl_log(struct req *req, const char *msg)
/*--------------------------------------------------------------------*/
static struct http *
vrt_selecthttp(const struct req *req, enum gethdr_e where)
vrt_selecthttp(const struct vrt_ctx *ctx, enum gethdr_e where)
{
struct http *hp;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
switch (where) {
case HDR_REQ:
hp = req->http;
hp = ctx->http_req;
break;
case HDR_BEREQ:
hp = req->busyobj->bereq;
hp = ctx->http_bereq;
break;
case HDR_BERESP:
hp = req->busyobj->beresp;
hp = ctx->http_beresp;
break;
case HDR_RESP:
hp = req->resp;
hp = ctx->http_resp;
break;
case HDR_OBJ:
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
hp = req->obj->http;
hp = ctx->http_obj;
break;
default:
INCOMPL();
}
CHECK_OBJ_NOTNULL(hp, HTTP_MAGIC);
return (hp);
}
char *
VRT_GetHdr(const struct req *req, const struct gethdr_s *hs)
VRT_GetHdr(const struct vrt_ctx *ctx, const struct gethdr_s *hs)
{
char *p;
struct http *hp;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
hp = vrt_selecthttp(req, hs->where);
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
hp = vrt_selecthttp(ctx, hs->where);
CHECK_OBJ_NOTNULL(hp, HTTP_MAGIC);
if (!http_GetHdr(hp, hs->what, &p))
return (NULL);
return (p);
......@@ -229,23 +228,25 @@ VRT_CollectString(struct ws *ws, const char *p, ...)
/*--------------------------------------------------------------------*/
void
VRT_SetHdr(struct req *req , const struct gethdr_s *hs, const char *p, ...)
VRT_SetHdr(const struct vrt_ctx *ctx , const struct gethdr_s *hs,
const char *p, ...)
{
struct http *hp;
va_list ap;
char *b;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(hs);
AN(hs->what);
hp = vrt_selecthttp(req, hs->where);
hp = vrt_selecthttp(ctx, hs->where);
CHECK_OBJ_NOTNULL(hp, HTTP_MAGIC);
va_start(ap, p);
if (p == vrt_magic_string_unset) {
http_Unset(hp, hs->what);
} else {
b = VRT_String(hp->ws, hs->what + 1, p, ap);
if (b == NULL) {
VSLb(req->vsl, SLT_LostHeader, "%s", hs->what + 1);
VSLb(ctx->vsl, SLT_LostHeader, "%s", hs->what + 1);
} else {
http_Unset(hp, hs->what);
http_SetHeader(hp, b);
......
......@@ -204,8 +204,8 @@ void VRT_error(struct req *, unsigned, const char *);
int VRT_switch_config(const char *);
const struct gethdr_s *VRT_MkGethdr(struct req *,enum gethdr_e, const char *);
char *VRT_GetHdr(const struct req *, const struct gethdr_s *);
void VRT_SetHdr(struct req *, const struct gethdr_s *, const char *, ...);
char *VRT_GetHdr(const struct vrt_ctx *, const struct gethdr_s *);
void VRT_SetHdr(const struct vrt_ctx *, const struct gethdr_s *, const char *, ...);
void VRT_handling(struct worker *, unsigned hand);
void VRT_hashdata(struct req *, const char *str, ...);
......
......@@ -165,7 +165,7 @@ sp_variables = (
'HEADER',
( 'client',),
( 'client',),
'cR'
'C'
),
('req.restarts',
'INT',
......@@ -279,7 +279,7 @@ sp_variables = (
'HEADER',
( 'pipe', 'backend_fetch', 'pass', 'miss', 'backend_response',),
( 'pipe', 'backend_fetch', 'pass', 'miss', 'backend_response',),
'cR'
'C'
),
('bereq.connect_timeout',
'DURATION',
......@@ -327,7 +327,7 @@ sp_variables = (
'HEADER',
( 'backend_response',),
( 'backend_response',),
'cR'
'C'
),
('beresp.do_esi',
'BOOL',
......@@ -435,7 +435,7 @@ sp_variables = (
'HEADER',
( 'lookup', 'error',),
( 'error',), # XXX ?
'cR'
'C'
),
('obj.ttl',
'DURATION',
......@@ -489,7 +489,7 @@ sp_variables = (
'HEADER',
( 'deliver',),
( 'deliver',),
'cR'
'C'
),
('now',
'TIME',
......@@ -885,6 +885,8 @@ def mk_proto(c, r=False):
s += " const"
elif i == "c":
pass
elif i == "C":
s += "const struct vrt_ctx *"
elif i == "R":
if r:
s += " const"
......
......@@ -418,7 +418,7 @@ vcc_expr_tostring(struct expr **e, enum var_type fmt)
case BYTES: p = "VRT_REAL_string(ws, \v1)"; break; /* XXX */
case REAL: p = "VRT_REAL_string(ws, \v1)"; break;
case TIME: p = "VRT_TIME_string(ws, \v1)"; break;
case HEADER: p = "VRT_GetHdr(req, \v1)"; break;
case HEADER: p = "VRT_GetHdr(ctx, \v1)"; break;
case ENUM:
case STRING:
case STRING_LIST:
......
......@@ -78,7 +78,7 @@ vcc_Var_Wildcard(struct vcc *tl, const struct token *t, const struct symbol *wc)
bprintf(buf, "&VGC_%s_%s", vh->rname, cnam);
v->rname = TlDup(tl, buf);
bprintf(buf, "VRT_SetHdr(req, %s, ", v->rname);
bprintf(buf, "VRT_SetHdr(ctx, %s, ", v->rname);
v->lname = TlDup(tl, buf);
sym = VCC_AddSymbolTok(tl, t, SYM_VAR);
......
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