mirror of
https://github.com/MetaCubeX/Clash.Meta.git
synced 2025-04-11 04:50:56 +00:00
refactor(dns): use option to avoid dns resolve
This commit is contained in:
parent
f213cd678f
commit
94a5b1a679
3 changed files with 16 additions and 11 deletions
|
@ -2,7 +2,6 @@ package config
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"net/netip"
|
||||
"strings"
|
||||
|
||||
"github.com/metacubex/mihomo/common/lru"
|
||||
|
@ -28,9 +27,8 @@ func (r *ruleMatcher) MatchDomain(domain string) bool {
|
|||
NetWork: C.TCP,
|
||||
Type: C.INNER, // avoid process lookup
|
||||
Host: domain,
|
||||
DstIP: netip.AddrFrom4([4]byte{}), // avoid dns lookup
|
||||
}
|
||||
p, _, err := tunnel.ResolveMetadata(meta)
|
||||
p, r, err := tunnel.ResolveMetadata(meta, &tunnel.ResolveOption{SkipResolveIP: true})
|
||||
if err != nil {
|
||||
log.Warnln("[DNS] ruleMatcher: match(%s) got err %v", domain, err.Error())
|
||||
return false
|
||||
|
@ -45,6 +43,9 @@ func (r *ruleMatcher) MatchDomain(domain string) bool {
|
|||
break
|
||||
}
|
||||
}
|
||||
log.Debugln("[DNS] ruleMatcher: domain(%s, %s) rule(%s)",
|
||||
domain, typ.String(), r)
|
||||
|
||||
typ = adapter.Type()
|
||||
cache.Set(domain, typ)
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ func (d *DNSDialer) DialContext(ctx context.Context, network, addr string) (net.
|
|||
}
|
||||
metadata.DstIP = dstIP
|
||||
}
|
||||
proxyAdapter, rule, err = ResolveMetadata(metadata)
|
||||
proxyAdapter, rule, err = ResolveMetadata(metadata, &ResolveOption{SkipResolveIP: true})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -151,7 +151,7 @@ func (d *DNSDialer) ListenPacket(ctx context.Context, network, addr string) (net
|
|||
var rule C.Rule
|
||||
if proxyAdapter == nil {
|
||||
if proxyName == DnsRespectRules {
|
||||
proxyAdapter, rule, err = ResolveMetadata(metadata)
|
||||
proxyAdapter, rule, err = ResolveMetadata(metadata, &ResolveOption{SkipResolveIP: true})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -324,7 +324,11 @@ func preHandleMetadata(metadata *C.Metadata) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func ResolveMetadata(metadata *C.Metadata) (proxy C.Proxy, rule C.Rule, err error) {
|
||||
type ResolveOption struct {
|
||||
SkipResolveIP bool
|
||||
}
|
||||
|
||||
func ResolveMetadata(metadata *C.Metadata, option *ResolveOption) (proxy C.Proxy, rule C.Rule, err error) {
|
||||
if metadata.SpecialProxy != "" {
|
||||
var exist bool
|
||||
proxy, exist = proxies[metadata.SpecialProxy]
|
||||
|
@ -341,7 +345,7 @@ func ResolveMetadata(metadata *C.Metadata) (proxy C.Proxy, rule C.Rule, err erro
|
|||
proxy = proxies["GLOBAL"]
|
||||
// Rule
|
||||
default:
|
||||
proxy, rule, err = match(metadata)
|
||||
proxy, rule, err = match(metadata, option)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
@ -393,7 +397,7 @@ func handleUDPConn(packet C.PacketAdapter) {
|
|||
return nil, nil, err
|
||||
}
|
||||
|
||||
proxy, rule, err := ResolveMetadata(metadata)
|
||||
proxy, rule, err := ResolveMetadata(metadata, &ResolveOption{})
|
||||
if err != nil {
|
||||
log.Warnln("[UDP] Parse metadata failed: %s", err.Error())
|
||||
return nil, nil, err
|
||||
|
@ -489,7 +493,7 @@ func handleTCPConn(connCtx C.ConnContext) {
|
|||
}()
|
||||
}
|
||||
|
||||
proxy, rule, err := ResolveMetadata(metadata)
|
||||
proxy, rule, err := ResolveMetadata(metadata, &ResolveOption{})
|
||||
if err != nil {
|
||||
log.Warnln("[Metadata] parse failed: %s", err.Error())
|
||||
return
|
||||
|
@ -592,7 +596,7 @@ func shouldResolveIP(rule C.Rule, metadata *C.Metadata) bool {
|
|||
return rule.ShouldResolveIP() && metadata.Host != "" && !metadata.DstIP.IsValid()
|
||||
}
|
||||
|
||||
func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) {
|
||||
func match(metadata *C.Metadata, option *ResolveOption) (C.Proxy, C.Rule, error) {
|
||||
configMux.RLock()
|
||||
defer configMux.RUnlock()
|
||||
var (
|
||||
|
@ -606,7 +610,7 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) {
|
|||
}
|
||||
|
||||
for _, rule := range getRules(metadata) {
|
||||
if !resolved && shouldResolveIP(rule, metadata) {
|
||||
if !resolved && !option.SkipResolveIP && shouldResolveIP(rule, metadata) {
|
||||
func() {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), resolver.DefaultDNSTimeout)
|
||||
defer cancel()
|
||||
|
|
Loading…
Add table
Reference in a new issue