Browse Source

caddyhttp: Support path matcher of "*" without panic

master
Matthew Holt 5 years ago
parent
commit
b62f8e0582
No known key found for this signature in database GPG Key ID: 2A349DD577D586A5
  1. 10
      modules/caddyhttp/matchers.go
  2. 20
      modules/caddyhttp/matchers_test.go

10
modules/caddyhttp/matchers.go

@ -211,9 +211,17 @@ func (m MatchPath) Match(r *http.Request) bool {
for _, matchPath := range m {
matchPath = repl.ReplaceAll(matchPath, "")
// special case: whole path is wildcard; this is unnecessary
// as it matches all requests, which is the same as no matcher
if matchPath == "*" {
return true
}
// special case: first and last characters are wildcard,
// treat it as a fast substring match
if strings.HasPrefix(matchPath, "*") && strings.HasSuffix(matchPath, "*") {
if len(matchPath) > 1 &&
strings.HasPrefix(matchPath, "*") &&
strings.HasSuffix(matchPath, "*") {
if strings.Contains(lowerPath, matchPath[1:len(matchPath)-1]) {
return true
}

20
modules/caddyhttp/matchers_test.go

@ -252,6 +252,26 @@ func TestPathMatcher(t *testing.T) {
input: "/foo/BAR.txt",
expect: true,
},
{
match: MatchPath{"*"},
input: "/",
expect: true,
},
{
match: MatchPath{"*"},
input: "/foo/bar",
expect: true,
},
{
match: MatchPath{"**"},
input: "/",
expect: true,
},
{
match: MatchPath{"**"},
input: "/foo/bar",
expect: true,
},
} {
req := &http.Request{URL: &url.URL{Path: tc.input}}
repl := caddy.NewReplacer()

Loading…
Cancel
Save