Support regex matching with attr (#2258)

* Support regex matching with attr

* Add test case

* Optimizing regex parsing at core start

* simpliy
This commit is contained in:
yuhan6665 2023-06-27 04:04:09 -04:00 committed by GitHub
parent 07389eca96
commit a6c5c57930
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 7 deletions

View file

@ -1,6 +1,7 @@
package router
import (
"regexp"
"strings"
"github.com/xtls/xray-core/common/net"
@ -282,18 +283,18 @@ func (m *ProtocolMatcher) Apply(ctx routing.Context) bool {
}
type AttributeMatcher struct {
configuredKeys map[string]string
configuredKeys map[string]*regexp.Regexp
}
// Match implements attributes matching.
func (m *AttributeMatcher) Match(attrs map[string]string) bool {
// headers are insensitive most likely. So we do a convert
// header keys are case insensitive most likely. So we do a convert
httpHeaders := make(map[string]string)
for key, value := range attrs {
httpHeaders[strings.ToLower(key)] = strings.ToLower(value)
httpHeaders[strings.ToLower(key)] = value
}
for key, value := range m.configuredKeys {
if a, ok := httpHeaders[key]; !ok || !strings.Contains(a, value) {
for key, regex := range m.configuredKeys {
if a, ok := httpHeaders[key]; !ok || !regex.MatchString(a) {
return false
}
}