Matthew Holt
5 years ago
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5
2 changed files with
27 additions and
4 deletions
-
modules/caddyhttp/matchers.go
-
modules/caddyhttp/matchers_test.go
|
|
@ -349,19 +349,21 @@ func (MatchQuery) CaddyModule() caddy.ModuleInfo { |
|
|
|
|
|
|
|
// UnmarshalCaddyfile implements caddyfile.Unmarshaler.
|
|
|
|
func (m *MatchQuery) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { |
|
|
|
if *m == nil { |
|
|
|
*m = make(map[string][]string) |
|
|
|
} |
|
|
|
|
|
|
|
for d.Next() { |
|
|
|
var query string |
|
|
|
if !d.Args(&query) { |
|
|
|
return d.ArgErr() |
|
|
|
} |
|
|
|
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()) |
|
|
|
} |
|
|
|
if *m == nil { |
|
|
|
*m = make(map[string][]string) |
|
|
|
} |
|
|
|
url.Values(*m).Set(parts[0], parts[1]) |
|
|
|
if d.NextBlock(0) { |
|
|
|
return d.Err("malformed query matcher: blocks are not supported") |
|
|
@ -372,6 +374,9 @@ func (m *MatchQuery) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { |
|
|
|
|
|
|
|
// Match returns true if r matches m.
|
|
|
|
func (m MatchQuery) Match(r *http.Request) bool { |
|
|
|
if m == nil { |
|
|
|
return len(r.URL.Query()) == 0 |
|
|
|
} |
|
|
|
for param, vals := range m { |
|
|
|
paramVal, found := r.URL.Query()[param] |
|
|
|
if found { |
|
|
|
|
|
@ -528,6 +528,24 @@ func TestQueryMatcher(t *testing.T) { |
|
|
|
input: "/?someparam", |
|
|
|
expect: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
scenario: "nil matcher value should match empty query", |
|
|
|
match: MatchQuery(nil), |
|
|
|
input: "/?", |
|
|
|
expect: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
scenario: "nil matcher value should NOT match a non-empty query", |
|
|
|
match: MatchQuery(nil), |
|
|
|
input: "/?foo=bar", |
|
|
|
expect: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
scenario: "non-nil matcher should NOT match an empty query", |
|
|
|
match: MatchQuery{"": []string{}}, |
|
|
|
input: "/?", |
|
|
|
expect: false, |
|
|
|
}, |
|
|
|
} { |
|
|
|
|
|
|
|
u, _ := url.Parse(tc.input) |
|
|
|