@@ -20,10 +20,13 @@ import (
20
20
"fmt"
21
21
"math/rand"
22
22
"net"
23
+ "net/netip"
24
+ "strconv"
23
25
"strings"
24
26
"sync"
25
27
26
28
"github.com/celzero/firestack/intra/core"
29
+ "github.com/celzero/firestack/intra/dialers"
27
30
"github.com/celzero/firestack/intra/dnsx"
28
31
"github.com/celzero/firestack/intra/ipn"
29
32
"github.com/celzero/firestack/intra/log"
@@ -232,7 +235,7 @@ func fetchDoHServerInfo(proxy *DcMulti, name string, stamp stamps.ServerStamp) (
232
235
func route (proxy * DcMulti , name string ) (udpaddr * net.UDPAddr , tcpaddr * net.TCPAddr , err error ) {
233
236
relayNames := proxy .routes
234
237
if relayNames == nil {
235
- log . I ("dnscrypt: No relay routes found. " )
238
+ err = errors . New ("dnscrypt: no relay routes" )
236
239
return
237
240
}
238
241
@@ -243,32 +246,47 @@ func route(proxy *DcMulti, name string) (udpaddr *net.UDPAddr, tcpaddr *net.TCPA
243
246
}
244
247
var relayCandidateStamp * stamps.ServerStamp
245
248
if len (relayName ) == 0 {
246
- err = fmt .Errorf ("route declared for [%v ] but an empty relay list " , name )
249
+ err = fmt .Errorf ("route declared for [%s ] but no relays " , name )
247
250
return
248
251
} else if relayStamp , err := stamps .NewServerStampFromString (relayName ); err == nil {
249
252
relayCandidateStamp = & relayStamp
250
- } else if _ , err := net . ResolveTCPAddr ( "tcp" , relayName ); err == nil {
253
+ } else {
251
254
relayCandidateStamp = & stamps.ServerStamp {
252
- ServerAddrStr : relayName ,
255
+ ServerAddrStr : relayName , // may be a hostname or ip-address
253
256
Proto : stamps .StampProtoTypeDNSCryptRelay ,
254
257
}
255
258
}
256
- if relayCandidateStamp == nil {
257
- err = fmt .Errorf ("undefined relay [%v] for server [%v]" , relayName , name )
258
- return
259
- }
259
+
260
+ s , p := hostport (relayCandidateStamp .ServerAddrStr )
260
261
if relayCandidateStamp .Proto == stamps .StampProtoTypeDNSCrypt ||
261
262
relayCandidateStamp .Proto == stamps .StampProtoTypeDNSCryptRelay {
262
- tcpaddr , err = net .ResolveTCPAddr ("tcp" , relayCandidateStamp .ServerAddrStr )
263
- if err == nil {
264
- udpaddr , err = net .ResolveUDPAddr ("udp" , relayCandidateStamp .ServerAddrStr )
263
+ if ips := dialers .For (s ); len (ips ) > 0 {
264
+ ipp := netip .AddrPortFrom (ips [0 ], p )
265
+ tcpaddr = net .TCPAddrFromAddrPort (ipp )
266
+ udpaddr = net .UDPAddrFromAddrPort (ipp )
267
+ } else {
268
+ err = fmt .Errorf ("zero ips for relay [%s@%s] for server [%s]" , relayName , s , name )
265
269
}
266
270
} else {
267
- err = fmt .Errorf ("invalid relay [%v ] for server [%v ]" , relayName , name )
271
+ err = fmt .Errorf ("invalid relay [%s ] for server [%s ]" , relayName , name )
268
272
}
269
273
return
270
274
}
271
275
276
+ func hostport (x string ) (string , uint16 ) {
277
+ s , port , err := net .SplitHostPort (x )
278
+ if err != nil || len (port ) <= 0 {
279
+ log .W ("dnscrypt: host-port og(%s); err? %v" , x , err )
280
+ s = x
281
+ port = "443" // use default port
282
+ }
283
+ p , err := strconv .Atoi (port )
284
+ if err != nil {
285
+ p = 443 // use default port
286
+ }
287
+ return s , uint16 (p )
288
+ }
289
+
272
290
func (s * ServerInfo ) String () string {
273
291
serverid := s .ID ()
274
292
servername := s .GetAddr ()
0 commit comments