Skip to content

Commit b2d2890

Browse files
committed
chore: cleanup resolveUDPAddr code
1 parent 8752f80 commit b2d2890

File tree

9 files changed

+31
-71
lines changed

9 files changed

+31
-71
lines changed

adapter/outbound/hysteria.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (h *Hysteria) genHdc(ctx context.Context, opts ...dialer.Option) utils.Pack
7878
return cDialer.ListenPacket(ctx, network, "", rAddrPort)
7979
},
8080
remoteAddr: func(addr string) (net.Addr, error) {
81-
return resolveUDPAddrWithPrefer(ctx, "udp", addr, h.prefer)
81+
return resolveUDPAddr(ctx, "udp", addr, h.prefer)
8282
},
8383
}
8484
}

adapter/outbound/hysteria2.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) {
171171
CWND: option.CWND,
172172
UdpMTU: option.UdpMTU,
173173
ServerAddress: func(ctx context.Context) (*net.UDPAddr, error) {
174-
return resolveUDPAddrWithPrefer(ctx, "udp", addr, C.NewDNSPrefer(option.IPVersion))
174+
return resolveUDPAddr(ctx, "udp", addr, C.NewDNSPrefer(option.IPVersion))
175175
},
176176
}
177177

@@ -188,7 +188,7 @@ func NewHysteria2(option Hysteria2Option) (*Hysteria2, error) {
188188
})
189189
if len(serverAddress) > 0 {
190190
clientOptions.ServerAddress = func(ctx context.Context) (*net.UDPAddr, error) {
191-
return resolveUDPAddrWithPrefer(ctx, "udp", serverAddress[randv2.IntN(len(serverAddress))], C.NewDNSPrefer(option.IPVersion))
191+
return resolveUDPAddr(ctx, "udp", serverAddress[randv2.IntN(len(serverAddress))], C.NewDNSPrefer(option.IPVersion))
192192
}
193193

194194
if option.HopInterval == 0 {

adapter/outbound/shadowsocks.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func (ss *ShadowSocks) ListenPacketWithDialer(ctx context.Context, dialer C.Dial
197197
return nil, err
198198
}
199199
}
200-
addr, err := resolveUDPAddrWithPrefer(ctx, "udp", ss.addr, ss.prefer)
200+
addr, err := resolveUDPAddr(ctx, "udp", ss.addr, ss.prefer)
201201
if err != nil {
202202
return nil, err
203203
}

adapter/outbound/shadowsocksr.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func (ssr *ShadowSocksR) ListenPacketWithDialer(ctx context.Context, dialer C.Di
102102
return nil, err
103103
}
104104
}
105-
addr, err := resolveUDPAddrWithPrefer(ctx, "udp", ssr.addr, ssr.prefer)
105+
addr, err := resolveUDPAddr(ctx, "udp", ssr.addr, ssr.prefer)
106106
if err != nil {
107107
return nil, err
108108
}

adapter/outbound/socks5.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func (ss *Socks5) ListenPacketContext(ctx context.Context, metadata *C.Metadata,
147147
err = errors.New("invalid UDP bind address")
148148
return
149149
} else if bindUDPAddr.IP.IsUnspecified() {
150-
serverAddr, err := resolveUDPAddr(ctx, "udp", ss.Addr())
150+
serverAddr, err := resolveUDPAddr(ctx, "udp", ss.Addr(), C.IPv4Prefer)
151151
if err != nil {
152152
return nil, err
153153
}

adapter/outbound/tuic.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ func (t *Tuic) dialWithDialer(ctx context.Context, dialer C.Dialer) (transport *
130130
return nil, nil, err
131131
}
132132
}
133-
udpAddr, err := resolveUDPAddrWithPrefer(ctx, "udp", t.addr, t.prefer)
133+
udpAddr, err := resolveUDPAddr(ctx, "udp", t.addr, t.prefer)
134134
if err != nil {
135135
return nil, nil, err
136136
}

adapter/outbound/util.go

+3-63
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,17 @@ package outbound
33
import (
44
"bytes"
55
"context"
6-
"crypto/tls"
76
"fmt"
87
"net"
98
"net/netip"
109
"regexp"
1110
"strconv"
12-
"sync"
1311

1412
"github.com/metacubex/mihomo/component/resolver"
1513
C "github.com/metacubex/mihomo/constant"
1614
"github.com/metacubex/mihomo/transport/socks5"
1715
)
1816

19-
var (
20-
globalClientSessionCache tls.ClientSessionCache
21-
once sync.Once
22-
)
23-
24-
func getClientSessionCache() tls.ClientSessionCache {
25-
once.Do(func() {
26-
globalClientSessionCache = tls.NewLRUClientSessionCache(128)
27-
})
28-
return globalClientSessionCache
29-
}
30-
3117
func serializesSocksAddr(metadata *C.Metadata) []byte {
3218
var buf [][]byte
3319
addrType := metadata.AddrType()
@@ -49,67 +35,21 @@ func serializesSocksAddr(metadata *C.Metadata) []byte {
4935
return bytes.Join(buf, nil)
5036
}
5137

52-
func resolveUDPAddr(ctx context.Context, network, address string) (*net.UDPAddr, error) {
53-
host, port, err := net.SplitHostPort(address)
54-
if err != nil {
55-
return nil, err
56-
}
57-
58-
ip, err := resolver.ResolveIPWithResolver(ctx, host, resolver.ProxyServerHostResolver)
59-
if err != nil {
60-
return nil, err
61-
}
62-
return net.ResolveUDPAddr(network, net.JoinHostPort(ip.String(), port))
63-
}
64-
65-
func resolveUDPAddrWithPrefer(ctx context.Context, network, address string, prefer C.DNSPrefer) (*net.UDPAddr, error) {
38+
func resolveUDPAddr(ctx context.Context, network, address string, prefer C.DNSPrefer) (*net.UDPAddr, error) {
6639
host, port, err := net.SplitHostPort(address)
6740
if err != nil {
6841
return nil, err
6942
}
7043
var ip netip.Addr
71-
var fallback netip.Addr
7244
switch prefer {
7345
case C.IPv4Only:
7446
ip, err = resolver.ResolveIPv4WithResolver(ctx, host, resolver.ProxyServerHostResolver)
7547
case C.IPv6Only:
7648
ip, err = resolver.ResolveIPv6WithResolver(ctx, host, resolver.ProxyServerHostResolver)
7749
case C.IPv6Prefer:
78-
var ips []netip.Addr
79-
ips, err = resolver.LookupIPWithResolver(ctx, host, resolver.ProxyServerHostResolver)
80-
if err == nil {
81-
for _, addr := range ips {
82-
if addr.Is6() {
83-
ip = addr
84-
break
85-
} else {
86-
if !fallback.IsValid() {
87-
fallback = addr
88-
}
89-
}
90-
}
91-
}
50+
ip, err = resolver.ResolveIPPrefer6WithResolver(ctx, host, resolver.ProxyServerHostResolver)
9251
default:
93-
// C.IPv4Prefer, C.DualStack and other
94-
var ips []netip.Addr
95-
ips, err = resolver.LookupIPWithResolver(ctx, host, resolver.ProxyServerHostResolver)
96-
if err == nil {
97-
for _, addr := range ips {
98-
if addr.Is4() {
99-
ip = addr
100-
break
101-
} else {
102-
if !fallback.IsValid() {
103-
fallback = addr
104-
}
105-
}
106-
}
107-
108-
}
109-
}
110-
111-
if !ip.IsValid() && fallback.IsValid() {
112-
ip = fallback
52+
ip, err = resolver.ResolveIPWithResolver(ctx, host, resolver.ProxyServerHostResolver)
11353
}
11454

11555
if err != nil {

adapter/outbound/wireguard.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ func (w *WireGuard) resolve(ctx context.Context, address M.Socksaddr) (netip.Add
301301
if address.Addr.IsValid() {
302302
return address.AddrPort(), nil
303303
}
304-
udpAddr, err := resolveUDPAddrWithPrefer(ctx, "udp", address.String(), w.prefer)
304+
udpAddr, err := resolveUDPAddr(ctx, "udp", address.String(), w.prefer)
305305
if err != nil {
306306
return netip.AddrPort{}, err
307307
}

component/resolver/resolver.go

+20
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,26 @@ func ResolveIP(ctx context.Context, host string) (netip.Addr, error) {
196196
return ResolveIPWithResolver(ctx, host, DefaultResolver)
197197
}
198198

199+
// ResolveIPPrefer6WithResolver same as ResolveIP, but with a resolver
200+
func ResolveIPPrefer6WithResolver(ctx context.Context, host string, r Resolver) (netip.Addr, error) {
201+
ips, err := LookupIPWithResolver(ctx, host, r)
202+
if err != nil {
203+
return netip.Addr{}, err
204+
} else if len(ips) == 0 {
205+
return netip.Addr{}, fmt.Errorf("%w: %s", ErrIPNotFound, host)
206+
}
207+
ipv4s, ipv6s := SortationAddr(ips)
208+
if len(ipv6s) > 0 {
209+
return ipv6s[randv2.IntN(len(ipv6s))], nil
210+
}
211+
return ipv4s[randv2.IntN(len(ipv4s))], nil
212+
}
213+
214+
// ResolveIPPrefer6 with a host, return ip and priority return TypeAAAA
215+
func ResolveIPPrefer6(ctx context.Context, host string) (netip.Addr, error) {
216+
return ResolveIPPrefer6WithResolver(ctx, host, DefaultResolver)
217+
}
218+
199219
func ResetConnection() {
200220
if DefaultResolver != nil {
201221
go DefaultResolver.ResetConnection()

0 commit comments

Comments
 (0)