diff options
Diffstat (limited to 'modules/caddyhttp')
-rw-r--r-- | modules/caddyhttp/matchers.go | 10 | ||||
-rw-r--r-- | modules/caddyhttp/matchers_test.go | 20 |
2 files changed, 29 insertions, 1 deletions
diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go index 6b57ead..988c92d 100644 --- a/modules/caddyhttp/matchers.go +++ b/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 } diff --git a/modules/caddyhttp/matchers_test.go b/modules/caddyhttp/matchers_test.go index 3b5afd2..1e50776 100644 --- a/modules/caddyhttp/matchers_test.go +++ b/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() |