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