Commit aef01728 authored by Geoff Simmons's avatar Geoff Simmons

Add the element enum to .backend().

parent a3c8b99b
...@@ -720,13 +720,14 @@ Example:: ...@@ -720,13 +720,14 @@ Example::
.. _xset.backend(): .. _xset.backend():
BACKEND xset.backend(INT n, ENUM select) BACKEND xset.backend(INT n, STRING element, ENUM select)
---------------------------------------- --------------------------------------------------------
:: ::
BACKEND xset.backend( BACKEND xset.backend(
INT n=0, INT n=0,
STRING element=0,
ENUM {UNIQUE, EXACT, FIRST, LAST, SHORTEST, LONGEST} select=UNIQUE ENUM {UNIQUE, EXACT, FIRST, LAST, SHORTEST, LONGEST} select=UNIQUE
) )
......
...@@ -48,6 +48,17 @@ varnish v1 -vcl { ...@@ -48,6 +48,17 @@ varnish v1 -vcl {
set resp.http.Backend-Longest set resp.http.Backend-Longest
= s.backend(select=LONGEST); = s.backend(select=LONGEST);
} }
set resp.http.Foo = s.backend(element="foo");
set resp.http.Bar = s.backend(element="bar");
set resp.http.Baz = s.backend(element="baz");
set resp.http.Quux = s.backend(element="quux");
set resp.http.Foobar = s.backend(element="foobar");
if (req.http.Element) {
set resp.http.Element
= s.backend(element=req.http.Element);
}
return (deliver); return (deliver);
} }
} -start } -start
...@@ -62,6 +73,12 @@ client c1 { ...@@ -62,6 +73,12 @@ client c1 {
expect resp.http.N-4 == "b4" expect resp.http.N-4 == "b4"
expect resp.http.N-5 == "b5" expect resp.http.N-5 == "b5"
expect resp.http.Foo == "b1"
expect resp.http.Bar == "b2"
expect resp.http.Baz == "b3"
expect resp.http.Quux == "b4"
expect resp.http.Foobar == "b5"
txreq -hdr "Word: foo" txreq -hdr "Word: foo"
rxresp rxresp
expect resp.status == 200 expect resp.status == 200
...@@ -128,6 +145,11 @@ client c1 { ...@@ -128,6 +145,11 @@ client c1 {
expect_close expect_close
} -run } -run
client c1 {
txreq -hdr "Element: oof"
expect_close
} -run
logexpect l1 -v v1 -d 1 -g vxid -q "VCL_Error" { logexpect l1 -v v1 -d 1 -g vxid -q "VCL_Error" {
expect 0 * Begin req expect 0 * Begin req
expect * = VCL_Error {^vmod selector failure: s\.backend\(\) called without prior match$} expect * = VCL_Error {^vmod selector failure: s\.backend\(\) called without prior match$}
...@@ -138,6 +160,11 @@ logexpect l1 -v v1 -d 1 -g vxid -q "VCL_Error" { ...@@ -138,6 +160,11 @@ logexpect l1 -v v1 -d 1 -g vxid -q "VCL_Error" {
expect * = VCL_Error {^vmod selector failure: s\.backend\(6\): set has 5 elements$} expect * = VCL_Error {^vmod selector failure: s\.backend\(6\): set has 5 elements$}
expect * = VCL_return fail expect * = VCL_return fail
expect * = End expect * = End
expect 0 * Begin req
expect * = VCL_Error {^vmod selector failure: s\.backend\(element="oof"\): no such element$}
expect * = VCL_return fail
expect * = End
} -run } -run
varnish v1 -vcl { varnish v1 -vcl {
...@@ -185,6 +212,18 @@ varnish v1 -vcl { ...@@ -185,6 +212,18 @@ varnish v1 -vcl {
set resp.http.Backend-Longest set resp.http.Backend-Longest
= s.backend(select=LONGEST); = s.backend(select=LONGEST);
} }
if (req.http.Element) {
set resp.http.Element
= s.backend(element=req.http.Element);
set resp.http.Element-Unique = s.backend(select=UNIQUE);
set resp.http.Element-Exact = s.backend(select=EXACT);
set resp.http.Element-First = s.backend(select=FIRST);
set resp.http.Element-Last = s.backend(select=LAST);
set resp.http.Element-Shortest
= s.backend(select=SHORTEST);
set resp.http.Element-Longest
= s.backend(select=LONGEST);
}
return (deliver); return (deliver);
} }
} }
...@@ -244,6 +283,17 @@ client c1 { ...@@ -244,6 +283,17 @@ client c1 {
expect resp.http.Backend-Last == "b4" expect resp.http.Backend-Last == "b4"
expect resp.http.Backend-Shortest == "b4" expect resp.http.Backend-Shortest == "b4"
expect resp.http.Backend-Longest == "b3" expect resp.http.Backend-Longest == "b3"
txreq -hdr "Element: foo"
rxresp
expect resp.status == 200
expect resp.http.Element == "b4"
expect resp.http.Element-Unique == "b4"
expect resp.http.Element-Exact == "b4"
expect resp.http.Element-First == "b4"
expect resp.http.Element-Last == "b4"
expect resp.http.Element-Shortest == "b4"
expect resp.http.Element-Longest == "b4"
} -run } -run
logexpect l1 -v v1 -d 0 -g vxid -q "VCL_Error" { logexpect l1 -v v1 -d 0 -g vxid -q "VCL_Error" {
......
...@@ -696,7 +696,8 @@ vmod_set_which(VRT_CTX, struct vmod_selector_set *set, VCL_ENUM selects) ...@@ -696,7 +696,8 @@ vmod_set_which(VRT_CTX, struct vmod_selector_set *set, VCL_ENUM selects)
static unsigned static unsigned
get_idx(VRT_CTX, VCL_INT n, const struct vmod_selector_set * const restrict set, get_idx(VRT_CTX, VCL_INT n, const struct vmod_selector_set * const restrict set,
const char * const restrict method, VCL_ENUM const restrict selects) const char * const restrict method, VCL_STRING const restrict element,
VCL_ENUM const restrict selects)
{ {
struct match_data *match; struct match_data *match;
...@@ -708,6 +709,12 @@ get_idx(VRT_CTX, VCL_INT n, const struct vmod_selector_set * const restrict set, ...@@ -708,6 +709,12 @@ get_idx(VRT_CTX, VCL_INT n, const struct vmod_selector_set * const restrict set,
} }
return (n - 1); return (n - 1);
} }
if (element != NULL)
if (!vmod_set_match(ctx, TRUST_ME(set), element)) {
VFAIL(ctx, "%s.%s(element=\"%s\"): no such element",
set->vcl_name, method, element);
return (UINT_MAX);
}
match = get_existing_match_data(ctx, set, method); match = get_existing_match_data(ctx, set, method);
if (match == NULL || match->n == 0) if (match == NULL || match->n == 0)
...@@ -724,7 +731,7 @@ vmod_set_element(VRT_CTX, struct vmod_selector_set *set, VCL_INT n, ...@@ -724,7 +731,7 @@ vmod_set_element(VRT_CTX, struct vmod_selector_set *set, VCL_INT n,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
idx = get_idx(ctx, n, set, "element", selects); idx = get_idx(ctx, n, set, "element", NULL, selects);
if (idx == UINT_MAX) if (idx == UINT_MAX)
return (NULL); return (NULL);
return (set->members[idx]); return (set->members[idx]);
...@@ -746,7 +753,7 @@ check_added(VRT_CTX, const struct vmod_selector_set * const restrict set, ...@@ -746,7 +753,7 @@ check_added(VRT_CTX, const struct vmod_selector_set * const restrict set,
VCL_BACKEND VCL_BACKEND
vmod_set_backend(VRT_CTX, struct vmod_selector_set *set, VCL_INT n, vmod_set_backend(VRT_CTX, struct vmod_selector_set *set, VCL_INT n,
VCL_ENUM selects) VCL_STRING element, VCL_ENUM selects)
{ {
unsigned idx; unsigned idx;
VCL_BACKEND b; VCL_BACKEND b;
...@@ -754,7 +761,7 @@ vmod_set_backend(VRT_CTX, struct vmod_selector_set *set, VCL_INT n, ...@@ -754,7 +761,7 @@ vmod_set_backend(VRT_CTX, struct vmod_selector_set *set, VCL_INT n,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
idx = get_idx(ctx, n, set, "backend", selects); idx = get_idx(ctx, n, set, "backend", element, selects);
if (idx == UINT_MAX) if (idx == UINT_MAX)
return (NULL); return (NULL);
if (!check_added(ctx, set, idx, BACKEND, "backend", "backend")) if (!check_added(ctx, set, idx, BACKEND, "backend", "backend"))
...@@ -775,7 +782,7 @@ vmod_set_string(VRT_CTX, struct vmod_selector_set * set, VCL_INT n, ...@@ -775,7 +782,7 @@ vmod_set_string(VRT_CTX, struct vmod_selector_set * set, VCL_INT n,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
idx = get_idx(ctx, n, set, "string", selects); idx = get_idx(ctx, n, set, "string", NULL, selects);
if (idx == UINT_MAX) if (idx == UINT_MAX)
return (NULL); return (NULL);
if (!check_added(ctx, set, idx, STRING, "string", "string")) if (!check_added(ctx, set, idx, STRING, "string", "string"))
...@@ -795,7 +802,7 @@ vmod_set_integer(VRT_CTX, struct vmod_selector_set * set, VCL_INT n, ...@@ -795,7 +802,7 @@ vmod_set_integer(VRT_CTX, struct vmod_selector_set * set, VCL_INT n,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
idx = get_idx(ctx, n, set, "integer", selects); idx = get_idx(ctx, n, set, "integer", NULL, selects);
if (idx == UINT_MAX) if (idx == UINT_MAX)
return (0); return (0);
if (!check_added(ctx, set, idx, INTEGER, "integer", "integer")) if (!check_added(ctx, set, idx, INTEGER, "integer", "integer"))
...@@ -815,7 +822,7 @@ get_re(VRT_CTX, const struct vmod_selector_set * const restrict set, ...@@ -815,7 +822,7 @@ get_re(VRT_CTX, const struct vmod_selector_set * const restrict set,
CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC); CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC); CHECK_OBJ_NOTNULL(set, VMOD_SELECTOR_SET_MAGIC);
idx = get_idx(ctx, n, set, method, selects); idx = get_idx(ctx, n, set, method, NULL, selects);
if (idx == UINT_MAX) if (idx == UINT_MAX)
return (NULL); return (NULL);
if (!check_added(ctx, set, idx, REGEX, method, "regex")) if (!check_added(ctx, set, idx, REGEX, method, "regex"))
......
...@@ -653,7 +653,7 @@ Example:: ...@@ -653,7 +653,7 @@ Example::
set resp.http.Location = "http://other.com" + myset.element(); set resp.http.Location = "http://other.com" + myset.element();
} }
$Method BACKEND .backend(INT n=0, $Method BACKEND .backend(INT n=0, STRING element=0,
ENUM {UNIQUE, EXACT, FIRST, LAST, SHORTEST, LONGEST} ENUM {UNIQUE, EXACT, FIRST, LAST, SHORTEST, LONGEST}
select=UNIQUE) select=UNIQUE)
......
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