Browse Source

http: path matcher supports exact matching with = prefix

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

20
modules/caddyhttp/matchers.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
}

15
modules/caddyhttp/matchers_test.go

@ -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",

Loading…
Cancel
Save