From b4f49e2962201a87037f451a0b68323524828a58 Mon Sep 17 00:00:00 2001 From: Francis Lavoie Date: Mon, 2 Nov 2020 18:05:01 -0500 Subject: [PATCH] caddyhttp: Merge query matchers in Caddyfile (#3839) Also, turns out that `Add` on headers will work even if there's nothing there yet, so we can remove the condition I introduced in #3832 --- .../caddyfile_adapt/matcher_syntax.txt | 28 +++++++++++++++++++ modules/caddyhttp/matchers.go | 27 +++++++----------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/caddytest/integration/caddyfile_adapt/matcher_syntax.txt b/caddytest/integration/caddyfile_adapt/matcher_syntax.txt index 55c06ea0..c5c27607 100644 --- a/caddytest/integration/caddyfile_adapt/matcher_syntax.txt +++ b/caddytest/integration/caddyfile_adapt/matcher_syntax.txt @@ -25,6 +25,12 @@ header Bar foo } respond @matcher7 "header matcher merging values of the same field" + + @matcher8 { + query foo=bar foo=baz bar=foo + query bar=baz + } + respond @matcher8 "query matcher merging pairs with the same keys" } ---------- { @@ -155,6 +161,28 @@ "handler": "static_response" } ] + }, + { + "match": [ + { + "query": { + "bar": [ + "foo", + "baz" + ], + "foo": [ + "bar", + "baz" + ] + } + } + ], + "handle": [ + { + "body": "query matcher merging pairs with the same keys", + "handler": "static_response" + } + ] } ] } diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go index cbb62538..b7a304f6 100644 --- a/modules/caddyhttp/matchers.go +++ b/modules/caddyhttp/matchers.go @@ -353,18 +353,16 @@ func (m *MatchQuery) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { *m = make(map[string][]string) } for d.Next() { - var query string - if !d.Args(&query) { - return d.ArgErr() + for _, query := range d.RemainingArgs() { + if query == "" { + continue + } + parts := strings.SplitN(query, "=", 2) + if len(parts) != 2 { + return d.Errf("malformed query matcher token: %s; must be in param=val format", d.Val()) + } + url.Values(*m).Add(parts[0], parts[1]) } - if query == "" { - continue - } - parts := strings.SplitN(query, "=", 2) - if len(parts) != 2 { - return d.Errf("malformed query matcher token: %s; must be in param=val format", d.Val()) - } - url.Values(*m).Set(parts[0], parts[1]) if d.NextBlock(0) { return d.Err("malformed query matcher: blocks are not supported") } @@ -411,12 +409,7 @@ func (m *MatchHeader) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { // If multiple header matchers with the same header field are defined, // we want to add the existing to the list of headers (will be OR'ed) - existing := http.Header(*m).Values(field) - if len(existing) > 0 { - http.Header(*m).Add(field, val) - } else { - http.Header(*m).Set(field, val) - } + http.Header(*m).Add(field, val) if d.NextBlock(0) { return d.Err("malformed header matcher: blocks are not supported")