@@ -10,6 +10,7 @@ import (
1010 "io"
1111 "net"
1212 "strconv"
13+ "strings"
1314 "sync"
1415 "sync/atomic"
1516 "time"
@@ -43,7 +44,7 @@ type xdnsConnClient struct {
4344 resolverSend []atomic.Uint32
4445
4546 clientID []byte
46- domain Name
47+ domains [] Name
4748
4849 pollChan chan struct {}
4950 readQueue chan * packet
@@ -58,10 +59,25 @@ func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) {
5859 return nil , errors .New ("empty resolvers" )
5960 }
6061
62+ var domains []Name
63+ var servers []string
64+ for _ , rs := range c .Resolvers {
65+ parts := strings .Split (rs , "+udp://" )
66+ if len (parts ) != 2 {
67+ return nil , errors .New ("invalid resolvers" )
68+ }
69+ domain , err := ParseName (parts [0 ])
70+ if err != nil {
71+ return nil , err
72+ }
73+ domains = append (domains , domain )
74+ servers = append (servers , parts [1 ])
75+ }
76+
6177 var resolverConns []net.PacketConn
6278 var resolverAddrs []* net.UDPAddr
6379 var resolverSend []atomic.Uint32
64- for _ , rs := range c . Resolvers {
80+ for _ , rs := range servers {
6581 h , p , err := net .SplitHostPort (rs )
6682 if err != nil {
6783 return nil , err
@@ -91,19 +107,14 @@ func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) {
91107 }
92108 resolverSend = make ([]atomic.Uint32 , len (resolverConns ))
93109
94- domain , err := ParseName (c .Domain )
95- if err != nil {
96- return nil , err
97- }
98-
99110 conn := & xdnsConnClient {
100111 conn : raw ,
101112 resolverConns : resolverConns ,
102113 resolverAddrs : resolverAddrs ,
103114 resolverSend : resolverSend ,
104115
105116 clientID : make ([]byte , 8 ),
106- domain : domain ,
117+ domains : domains ,
107118
108119 pollChan : make (chan struct {}, pollLimit ),
109120 readQueue : make (chan * packet , 256 ),
@@ -147,7 +158,7 @@ func (c *xdnsConnClient) recvLoop() {
147158 continue
148159 }
149160
150- payload , valid := dnsResponsePayload (& resp , c .domain )
161+ payload , valid := dnsResponsePayload (& resp , c .domains )
151162 if valid {
152163 c .resolverSend [i ].Store (0 )
153164 }
@@ -221,7 +232,7 @@ func (c *xdnsConnClient) sendLoop() {
221232 default :
222233 }
223234 } else {
224- encoded , _ := encode (nil , c .clientID , c .domain )
235+ encoded , _ := encode (nil , c .clientID , c .domains [ c . resolverIdx ] )
225236 p = & packet {
226237 p : encoded ,
227238 }
@@ -281,7 +292,7 @@ func (c *xdnsConnClient) WriteTo(p []byte, addr net.Addr) (n int, err error) {
281292 return 0 , io .ErrClosedPipe
282293 }
283294
284- encoded , err := encode (p , c .clientID , c .domain )
295+ encoded , err := encode (p , c .clientID , c .domains [ c . resolverIdx ] )
285296 if err != nil {
286297 errors .LogDebug (context .Background (), addr , " xdns wireformat err " , err , " " , len (p ))
287298 return 0 , nil
@@ -421,7 +432,7 @@ func nextPacket(r *bytes.Reader) ([]byte, error) {
421432 return p , err
422433}
423434
424- func dnsResponsePayload (resp * Message , domain Name ) (payload []byte , valid bool ) {
435+ func dnsResponsePayload (resp * Message , domains [] Name ) (payload []byte , valid bool ) {
425436 payload = nil
426437 valid = false
427438
@@ -437,7 +448,13 @@ func dnsResponsePayload(resp *Message, domain Name) (payload []byte, valid bool)
437448 }
438449 answer := resp .Answer [0 ]
439450
440- _ , ok := answer .Name .TrimSuffix (domain )
451+ var ok bool
452+ for _ , domain := range domains {
453+ _ , ok = answer .Name .TrimSuffix (domain )
454+ if ok {
455+ break
456+ }
457+ }
441458 if ! ok {
442459 return
443460 }
0 commit comments