Browse Source
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
master
Francis Lavoie
5 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
38 additions and
17 deletions
-
caddytest/integration/caddyfile_adapt/matcher_syntax.txt
-
modules/caddyhttp/matchers.go
|
|
@ -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" |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
] |
|
|
|
} |
|
|
|
|
|
@ -353,10 +353,7 @@ 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 |
|
|
|
} |
|
|
@ -364,7 +361,8 @@ func (m *MatchQuery) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { |
|
|
|
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]) |
|
|
|
url.Values(*m).Add(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) |
|
|
|
} |
|
|
|
|
|
|
|
if d.NextBlock(0) { |
|
|
|
return d.Err("malformed header matcher: blocks are not supported") |
|
|
|