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