Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
libvmod-re
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
uplex-varnish
libvmod-re
Commits
38fd9c23
Unverified
Commit
38fd9c23
authored
Jul 20, 2023
by
Nils Goroll
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor vmod_regex_match_body for reuse
parent
847df22b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
33 additions
and
16 deletions
+33
-16
vmod_re.c
src/vmod_re.c
+33
-16
No files found.
src/vmod_re.c
View file @
38fd9c23
...
...
@@ -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
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment