mirror of
https://github.com/caddyserver/caddy.git
synced 2025-11-16 11:17:46 +08:00
Merge branch 'v2' of ssh://github.com/caddyserver/caddy into v2
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user