Refactor vmod_regex_match_body for reuse

parent 847df22b
......@@ -636,22 +636,23 @@ match_iter_f(void *priv, unsigned flush, const void *ptr, ssize_t len)
return (reip_iter(reip, flush, ptr, len));
}
VCL_BOOL
vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
VCL_INT limit, VCL_INT limit_recursion)
static VCL_BOOL
reip_match_body(struct re_iter_priv *reip, struct vmod_re_regex *re,
objiterate_f iter, VCL_ENUM which)
{
struct re_iter_priv reip[1];
VRT_CTX;
struct vmod_priv *task;
struct vre_limits buf;
uint32_t u;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(reip, RE_ITER_PRIV_MAGIC);
CHECK_OBJ_NOTNULL(re, VMOD_RE_REGEX_MAGIC);
AN(re->vre);
ctx = reip->ctx;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AZ(pcre2_pattern_info(VRE_unpack(re->vre), PCRE2_INFO_ARGOPTIONS, &u));
if ((u & PCRE2_PARTIAL_HARD) == 0) {
VRT_fail(ctx, "vmod re: .match_body() requires "
VRT_fail(ctx, "vmod re: .*_body() requires "
"construction with forbody=true");
return (0);
}
......@@ -659,7 +660,8 @@ vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
task = VRT_priv_task(ctx, re);
if (task == NULL) {
errmsg(ctx, "vmod re: Could not get a PRIV_TASK - out of workspace?");
errmsg(ctx, "vmod re: Could not get a PRIV_TASK - "
"out of workspace?");
return (0);
}
......@@ -667,13 +669,13 @@ vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
if (task->priv == NULL)
return (0);
INIT_OBJ(reip, RE_ITER_PRIV_MAGIC);
reip->options = PCRE2_PARTIAL_HARD;
reip->s = PCRE2_ERROR_NOMATCH;
reip->ctx = ctx;
AZ(reip->vre);
reip->vre = re->vre;
AZ(reip->task);
reip->task = task;
reip->vre_limits = get_limits(re, &buf, limit, limit_recursion);
AN(reip->vre_limits);
if (which == VENUM(req_body)) {
if (ctx->req == NULL)
......@@ -681,12 +683,12 @@ vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
"called but no request body found");
else
(void) VRB_Iterate(ctx->req->wrk, ctx->vsl, ctx->req,
match_iter_f, reip);
iter, reip);
}
else if (which == VENUM(bereq_body) &&
ctx->bo != NULL && ctx->bo->bereq_body != NULL) {
(void) ObjIterate(ctx->bo->wrk, ctx->bo->bereq_body,
reip, match_iter_f, 0);
reip, iter, 0);
}
else if (which == VENUM(bereq_body)) {
if (ctx->bo == NULL || ctx->bo->req == NULL)
......@@ -694,7 +696,7 @@ vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
"called but no backend request body found");
else
(void) VRB_Iterate(ctx->bo->wrk, ctx->vsl, ctx->bo->req,
match_iter_f, reip);
iter, reip);
}
else if (which == VENUM(resp_body)) {
if (ctx->req == NULL || ctx->req->objcore == NULL)
......@@ -702,12 +704,12 @@ vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
"called but no response body found");
else
(void) ObjIterate(ctx->req->wrk, ctx->req->objcore,
reip, match_iter_f, 0);
reip, iter, 0);
}
// XXX core code does not send OBJ_ITER_END reliably
if (reip->s == PCRE2_ERROR_PARTIAL)
(void) match_iter_f(reip, OBJ_ITER_END, "", 0);
(void) iter(reip, OBJ_ITER_END, "", 0);
AZ(reip->buf);
......@@ -723,6 +725,21 @@ vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
return (0);
}
VCL_BOOL
vmod_regex_match_body(VRT_CTX, struct vmod_re_regex *re, VCL_ENUM which,
VCL_INT limit, VCL_INT limit_recursion)
{
struct re_iter_priv reip[1];
struct vre_limits buf;
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
INIT_OBJ(reip, RE_ITER_PRIV_MAGIC);
reip->ctx = ctx;
reip->vre_limits = get_limits(re, &buf, limit, limit_recursion);
return (reip_match_body(reip, re, match_iter_f, which));
}
VCL_STRING
vmod_regex_backref(VRT_CTX, struct vmod_re_regex *re, VCL_INT refnum,
VCL_STRING fallback)
......
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