Commit f3579552 authored by Geoff Simmons's avatar Geoff Simmons

namedref() method and function fail if the fallback is NULL, and add

tests for failure if the name parameter is NULL or empty
parent 4de7fa5a
......@@ -163,6 +163,15 @@ varnish v1 -vcl+backend {
if (barbaz.match(resp.http.foo)) {
set resp.http.foo1 = barbaz.namedref("bar", "error1");
set resp.http.foo2 = barbaz.namedref("baz", "error2");
set resp.http.undeffallback
= barbaz.namedref("bar", resp.http.undef);
# Fail if the name is empty or undefined
set resp.http.emptyname
= barbaz.namedref("", "name empty");
set resp.http.undefname
= barbaz.namedref(req.http.undef,
"name undefined");
}
if (barbaz.match(resp.http.barf)) {
......@@ -184,12 +193,16 @@ varnish v1 -vcl+backend {
}
set resp.http.never1 = never.namedref("bar", "fallback1");
set resp.http.never2 = never.namedref("baz", "fallback2");
set resp.http.nofallback = never.namedref("bar");
}
}
logexpect l2 -v v1 -d 0 -g vxid -q "VCL_Error" {
expect 0 * Begin req
expect * = VCL_Error "^vmod re2 error: backref 1, fallback .fallback.: backref called without prior match$"
expect * = VCL_Error "^vmod re2 error: barbaz.namedref..: fallback is undefined$"
expect * = VCL_Error "^vmod re2 error: barbaz.namedref.name=.., fallback=.name empty..: name is empty$"
expect * = VCL_Error "^vmod re2 error: barbaz.namedref.name=.., fallback=.name undefined..: name is empty$"
expect * = VCL_Error "^vmod re2 error: never.namedref.name=.bar., fallback=.fallback1..: never_capture is true for object never$"
expect * = VCL_Error "^vmod re2 error: never.namedref.name=.baz., fallback=.fallback2..: never_capture is true for object never$"
......@@ -206,6 +219,9 @@ client c2 {
expect resp.http.frob2 == "fallback2"
expect resp.http.foo1 == "bar"
expect resp.http.foo2 == "baz"
expect resp.http.undeffallback ~ "^..NAMEDREF (METHOD|FUNCTION) FAILED..$"
expect resp.http.emptyname == "name empty"
expect resp.http.undefname == "name undefined"
expect resp.http.puke == <undef>
expect resp.http.barf1 == "fallback1"
expect resp.http.barf2 == "fallback2"
......@@ -216,6 +232,7 @@ client c2 {
expect resp.http.never == "match"
expect resp.http.never1 == "fallback1"
expect resp.http.never2 == "fallback2"
expect resp.http.nofallback ~ "^..NAMEDREF (METHOD|FUNCTION) FAILED..$"
} -run
logexpect l2 -wait
......@@ -316,6 +333,13 @@ varnish v1 -vcl+backend {
if (re2.match("(?P<bar>bar)(?P<baz>baz)", resp.http.foo)) {
set resp.http.foo1 = re2.namedref("bar", "error1");
set resp.http.foo2 = re2.namedref("baz", "error2");
set resp.http.undeffallback
= re2.namedref("bar", resp.http.undef);
set resp.http.emptyname
= re2.namedref("", "name empty");
set resp.http.undefname
= re2.namedref(req.http.undef,
"name undefined");
}
if (re2.match("(?P<bar>bar)(?P<baz>baz)", resp.http.barf)) {
......@@ -338,12 +362,16 @@ varnish v1 -vcl+backend {
}
set resp.http.never1 = re2.namedref("bar", "fallback1");
set resp.http.never2 = re2.namedref("baz", "fallback2");
set resp.http.nofallback = re2.namedref("bar");
}
}
logexpect l4 -v v1 -d 0 -g vxid -q "VCL_Error" {
expect 0 * Begin req
expect * = VCL_Error "^vmod re2 error: re2.namedref.name=.bar., fallback=.fallback..: called without previous match$"
expect * = VCL_Error "^vmod re2 error: re2.namedref..: fallback is undefined$"
expect * = VCL_Error "^vmod re2 error: re2.namedref.name=.., fallback=.name empty..: name is empty$"
expect * = VCL_Error "^vmod re2 error: re2.namedref.name=.., fallback=.name undefined..: name is empty$"
expect * = VCL_Error "^vmod re2 error: re2.namedref.name=.bar., fallback=.fallback1..: never_capture was true in previous match$"
expect * = VCL_Error "^vmod re2 error: re2.namedref.name=.baz., fallback=.fallback2..: never_capture was true in previous match$"
......
......@@ -43,6 +43,9 @@
#include "vre2/vre2.h"
#include "vre2/vre2set.h"
#define ERR(ctx, msg) \
errmsg((ctx), "vmod re2 error: " msg)
#define VERR(ctx, fmt, ...) \
errmsg((ctx), "vmod re2 error: " fmt, __VA_ARGS__)
......@@ -394,8 +397,10 @@ vmod_regex_namedref(VRT_CTX, struct vmod_re2_regex *re, VCL_STRING name,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(re, VMOD_RE2_REGEX_MAGIC);
if (fallback == NULL)
fallback = "";
if (fallback == NULL) {
VERR(ctx, "%s.namedref(): fallback is undefined", re->vcl_name);
return "**NAMEDREF METHOD FAILED**";
}
if (name == NULL || name[0] == '\0') {
VERR(ctx, ERR_PREFIX "name is empty", re->vcl_name, "",
fallback);
......@@ -690,8 +695,10 @@ vmod_namedref(VRT_CTX, struct vmod_priv *priv, VCL_STRING name,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
AN(priv);
if (fallback == NULL)
fallback = "";
if (fallback == NULL) {
ERR(ctx, "re2.namedref(): fallback is undefined");
return "**NAMEDREF FUNCTION FAILED**";
}
if (name == NULL || name[0] == '\0') {
VERR(ctx, ERR_PREFIX "name is empty", "", fallback);
return 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