caddyhttp: Support path matcher of "*" without panic

This commit is contained in:
Matthew Holt 2020-03-16 16:08:33 -06:00
parent ae86f6dd91
commit b62f8e0582
No known key found for this signature in database
GPG key ID: 2A349DD577D586A5
2 changed files with 29 additions and 1 deletions

View file

@ -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
}

View file

@ -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()