Browse Source
http: path matcher supports exact matching with = prefix
master
Matthew Holt
5 years ago
No known key found for this signature in database
GPG Key ID: 2A349DD577D586A5
2 changed files with
32 additions and
3 deletions
-
modules/caddyhttp/matchers.go
-
modules/caddyhttp/matchers_test.go
|
|
@ -166,16 +166,30 @@ func (m MatchPath) Provision(_ caddy.Context) error { |
|
|
|
func (m MatchPath) Match(r *http.Request) bool { |
|
|
|
lowerPath := strings.ToLower(r.URL.Path) |
|
|
|
for _, matchPath := range m { |
|
|
|
// as a special case, if the first character is a
|
|
|
|
// wildcard, treat it as a quick suffix match
|
|
|
|
// special case: first character is equals sign,
|
|
|
|
// treat it as an exact match
|
|
|
|
if strings.HasPrefix(matchPath, "=") { |
|
|
|
if lowerPath == matchPath[1:] { |
|
|
|
return true |
|
|
|
} |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
// special case: first character is a wildcard,
|
|
|
|
// treat it as a fast suffix match
|
|
|
|
if strings.HasPrefix(matchPath, "*") { |
|
|
|
return strings.HasSuffix(lowerPath, matchPath[1:]) |
|
|
|
if strings.HasSuffix(lowerPath, matchPath[1:]) { |
|
|
|
return true |
|
|
|
} |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
// can ignore error here because we can't handle it anyway
|
|
|
|
matches, _ := filepath.Match(matchPath, lowerPath) |
|
|
|
if matches { |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
|
|
if strings.HasPrefix(lowerPath, matchPath) { |
|
|
|
return true |
|
|
|
} |
|
|
|
|
|
@ -212,6 +212,21 @@ func TestPathMatcher(t *testing.T) { |
|
|
|
input: "/foo/bar/bam", |
|
|
|
expect: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
match: MatchPath{"=/foo"}, |
|
|
|
input: "/foo", |
|
|
|
expect: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
match: MatchPath{"=/foo"}, |
|
|
|
input: "/foo/bar", |
|
|
|
expect: false, |
|
|
|
}, |
|
|
|
{ |
|
|
|
match: MatchPath{"=/foo"}, |
|
|
|
input: "/FOO", |
|
|
|
expect: true, |
|
|
|
}, |
|
|
|
{ |
|
|
|
match: MatchPath{"/foo"}, |
|
|
|
input: "/FOO", |
|
|
|