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
This commit is contained in:
Francis Lavoie 2020-11-02 18:05:01 -05:00 committed by GitHub
parent dd26875ffc
commit b4f49e2962
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 17 deletions

View file

@ -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"
}
]
}
]
}

View file

@ -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")