diff options
author | James Birtles <jameshbirtles@gmail.com> | 2020-06-26 22:14:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-26 15:14:47 -0600 |
commit | ddd690de4cc133bc728f765b2492ccb54f9d84ca (patch) | |
tree | e45c3554f03138efabd00b532aaad5bae521c282 /modules/caddyhttp | |
parent | 6004d3f779b8175d92d8eb7819ed800e8eddbff6 (diff) |
caddyhttp: Support placeholders in query matcher (#3521)
Diffstat (limited to 'modules/caddyhttp')
-rw-r--r-- | modules/caddyhttp/matchers.go | 3 | ||||
-rw-r--r-- | modules/caddyhttp/matchers_test.go | 17 |
2 files changed, 20 insertions, 0 deletions
diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go index a291242..164f443 100644 --- a/modules/caddyhttp/matchers.go +++ b/modules/caddyhttp/matchers.go @@ -374,10 +374,13 @@ func (m *MatchQuery) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { // Match returns true if r matches m. An empty m matches an empty query string. func (m MatchQuery) Match(r *http.Request) bool { + repl := r.Context().Value(caddy.ReplacerCtxKey).(*caddy.Replacer) for param, vals := range m { + param = repl.ReplaceAll(param, "") paramVal, found := r.URL.Query()[param] if found { for _, v := range vals { + v = repl.ReplaceAll(v, "") if paramVal[0] == v || v == "*" { return true } diff --git a/modules/caddyhttp/matchers_test.go b/modules/caddyhttp/matchers_test.go index 1ac9588..883680f 100644 --- a/modules/caddyhttp/matchers_test.go +++ b/modules/caddyhttp/matchers_test.go @@ -546,11 +546,28 @@ func TestQueryMatcher(t *testing.T) { input: "/?", expect: false, }, + { + scenario: "match against a placeholder value", + match: MatchQuery{"debug": []string{"{http.vars.debug}"}}, + input: "/?debug=1", + expect: true, + }, + { + scenario: "match against a placeholder key", + match: MatchQuery{"{http.vars.key}": []string{"1"}}, + input: "/?somekey=1", + expect: true, + }, } { u, _ := url.Parse(tc.input) req := &http.Request{URL: u} + repl := caddy.NewReplacer() + ctx := context.WithValue(req.Context(), caddy.ReplacerCtxKey, repl) + repl.Set("http.vars.debug", "1") + repl.Set("http.vars.key", "somekey") + req = req.WithContext(ctx) actual := tc.match.Match(req) if actual != tc.expect { t.Errorf("Test %d %v: Expected %t, got %t for '%s'", i, tc.match, tc.expect, actual, tc.input) |