mirror of
https://github.com/SagerNet/sing-box.git
synced 2024-11-23 00:51:29 +00:00
48 lines
973 B
Go
48 lines
973 B
Go
|
package domain
|
||
|
|
||
|
import "unicode/utf8"
|
||
|
|
||
|
type Matcher struct {
|
||
|
set *succinctSet
|
||
|
}
|
||
|
|
||
|
func NewMatcher(domains []string, domainSuffix []string) *Matcher {
|
||
|
var domainList []string
|
||
|
for _, domain := range domains {
|
||
|
domainList = append(domainList, reverseDomain(domain))
|
||
|
}
|
||
|
for _, domain := range domainSuffix {
|
||
|
domainList = append(domainList, reverseDomainSuffix(domain))
|
||
|
}
|
||
|
return &Matcher{
|
||
|
newSuccinctSet(domainList),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *Matcher) Match(domain string) bool {
|
||
|
return m.set.Has(reverseDomain(domain))
|
||
|
}
|
||
|
|
||
|
func reverseDomain(domain string) string {
|
||
|
l := len(domain)
|
||
|
b := make([]byte, l)
|
||
|
for i := 0; i < l; {
|
||
|
r, n := utf8.DecodeRuneInString(domain[i:])
|
||
|
i += n
|
||
|
utf8.EncodeRune(b[l-i:], r)
|
||
|
}
|
||
|
return string(b)
|
||
|
}
|
||
|
|
||
|
func reverseDomainSuffix(domain string) string {
|
||
|
l := len(domain)
|
||
|
b := make([]byte, l+1)
|
||
|
for i := 0; i < l; {
|
||
|
r, n := utf8.DecodeRuneInString(domain[i:])
|
||
|
i += n
|
||
|
utf8.EncodeRune(b[l-i:], r)
|
||
|
}
|
||
|
b[l] = prefixLabel
|
||
|
return string(b)
|
||
|
}
|