summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/caddyhttp/matchers.go20
-rw-r--r--modules/caddyhttp/matchers_test.go56
2 files changed, 71 insertions, 5 deletions
diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go
index c0e3872..82fb04a 100644
--- a/modules/caddyhttp/matchers.go
+++ b/modules/caddyhttp/matchers.go
@@ -255,8 +255,16 @@ 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() {
- parts := strings.SplitN(d.Val(), "=", 2)
+ var query string
+ if !d.Args(&query) {
+ return d.ArgErr()
+ }
+ 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())
}
@@ -268,10 +276,12 @@ func (m *MatchQuery) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
// Match returns true if r matches m.
func (m MatchQuery) Match(r *http.Request) bool {
for param, vals := range m {
- paramVal := r.URL.Query().Get(param)
- for _, v := range vals {
- if paramVal == v {
- return true
+ paramVal, found := r.URL.Query()[param]
+ if found {
+ for _, v := range vals {
+ if paramVal[0] == v || v == "*" {
+ return true
+ }
}
}
}
diff --git a/modules/caddyhttp/matchers_test.go b/modules/caddyhttp/matchers_test.go
index 9fa7d8e..f5ec034 100644
--- a/modules/caddyhttp/matchers_test.go
+++ b/modules/caddyhttp/matchers_test.go
@@ -391,6 +391,62 @@ func TestHeaderMatcher(t *testing.T) {
}
}
+func TestQueryMatcher(t *testing.T) {
+ for i, tc := range []struct {
+ scenario string
+ match MatchQuery
+ input string
+ expect bool
+ }{
+ {
+ scenario: "non match against a specific value",
+ match: MatchQuery{"debug": []string{"1"}},
+ input: "/",
+ expect: false,
+ },
+ {
+ scenario: "match against a specific value",
+ match: MatchQuery{"debug": []string{"1"}},
+ input: "/?debug=1",
+ expect: true,
+ },
+ {
+ scenario: "match against a wildcard",
+ match: MatchQuery{"debug": []string{"*"}},
+ input: "/?debug=something",
+ expect: true,
+ },
+ {
+ scenario: "non match against a wildcarded",
+ match: MatchQuery{"debug": []string{"*"}},
+ input: "/?other=something",
+ expect: false,
+ },
+ {
+ scenario: "match against an empty value",
+ match: MatchQuery{"debug": []string{""}},
+ input: "/?debug",
+ expect: true,
+ },
+ {
+ scenario: "non match against an empty value",
+ match: MatchQuery{"debug": []string{""}},
+ input: "/?someparam",
+ expect: false,
+ },
+ } {
+
+ u, _ := url.Parse(tc.input)
+
+ req := &http.Request{URL: u}
+ 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)
+ continue
+ }
+ }
+}
+
func TestHeaderREMatcher(t *testing.T) {
for i, tc := range []struct {
match MatchHeaderRE