mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2024-12-26 12:15:44 +08:00
45 lines
901 B
Go
45 lines
901 B
Go
|
package provider
|
||
|
|
||
|
import (
|
||
|
"github.com/Dreamacro/clash/component/trie"
|
||
|
C "github.com/Dreamacro/clash/constant"
|
||
|
"github.com/Dreamacro/clash/log"
|
||
|
)
|
||
|
|
||
|
type ipcidrStrategy struct {
|
||
|
count int
|
||
|
shouldResolveIP bool
|
||
|
trie *trie.IpCidrTrie
|
||
|
}
|
||
|
|
||
|
func (i *ipcidrStrategy) Match(metadata *C.Metadata) bool {
|
||
|
return i.trie != nil && i.trie.IsContain(metadata.DstIP)
|
||
|
}
|
||
|
|
||
|
func (i *ipcidrStrategy) Count() int {
|
||
|
return i.count
|
||
|
}
|
||
|
|
||
|
func (i *ipcidrStrategy) ShouldResolveIP() bool {
|
||
|
return i.shouldResolveIP
|
||
|
}
|
||
|
|
||
|
func (i *ipcidrStrategy) OnUpdate(rules []string) {
|
||
|
ipCidrTrie := trie.NewIpCidrTrie()
|
||
|
for _, rule := range rules {
|
||
|
err := ipCidrTrie.AddIpCidrForString(rule)
|
||
|
if err != nil {
|
||
|
log.Warnln("invalid Ipcidr:[%s]", rule)
|
||
|
} else {
|
||
|
i.count++
|
||
|
}
|
||
|
}
|
||
|
|
||
|
i.trie = ipCidrTrie
|
||
|
i.shouldResolveIP = i.count > 0
|
||
|
}
|
||
|
|
||
|
func NewIPCidrStrategy() *ipcidrStrategy {
|
||
|
return &ipcidrStrategy{}
|
||
|
}
|