@@ -26,6 +26,7 @@ import (
26
26
"fmt"
27
27
rand "math/rand/v2"
28
28
"net"
29
+ "net/netip"
29
30
"os"
30
31
"strconv"
31
32
"strings"
@@ -122,7 +123,7 @@ func (b *dnsBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts
122
123
}
123
124
124
125
// IP address.
125
- if ipAddr , ok := formatIP (host ); ok {
126
+ if ipAddr , err := formatIP (host ); err == nil {
126
127
addr := []resolver.Address {{Addr : ipAddr + ":" + port }}
127
128
cc .UpdateState (resolver.State {Addresses : addr })
128
129
return deadResolver {}, nil
@@ -260,9 +261,9 @@ func (d *dnsResolver) lookupSRV(ctx context.Context) ([]resolver.Address, error)
260
261
return nil , err
261
262
}
262
263
for _ , a := range lbAddrs {
263
- ip , ok := formatIP (a )
264
- if ! ok {
265
- return nil , fmt .Errorf ("dns: error parsing A record IP address %v" , a )
264
+ ip , err := formatIP (a )
265
+ if err != nil {
266
+ return nil , fmt .Errorf ("dns: error parsing A record IP address %v: %v " , a , err )
266
267
}
267
268
addr := ip + ":" + strconv .Itoa (int (s .Port ))
268
269
newAddrs = append (newAddrs , resolver.Address {Addr : addr , ServerName : s .Target })
@@ -322,9 +323,9 @@ func (d *dnsResolver) lookupHost(ctx context.Context) ([]resolver.Address, error
322
323
}
323
324
newAddrs := make ([]resolver.Address , 0 , len (addrs ))
324
325
for _ , a := range addrs {
325
- ip , ok := formatIP (a )
326
- if ! ok {
327
- return nil , fmt .Errorf ("dns: error parsing A record IP address %v" , a )
326
+ ip , err := formatIP (a )
327
+ if err != nil {
328
+ return nil , fmt .Errorf ("dns: error parsing A record IP address %v: %v " , a , err )
328
329
}
329
330
addr := ip + ":" + d .port
330
331
newAddrs = append (newAddrs , resolver.Address {Addr : addr })
@@ -351,19 +352,19 @@ func (d *dnsResolver) lookup() (*resolver.State, error) {
351
352
return & state , nil
352
353
}
353
354
354
- // formatIP returns ok = false if addr is not a valid textual representation of
355
- // an IP address. If addr is an IPv4 address, return the addr and ok = true .
355
+ // formatIP returns an error if addr is not a valid textual representation of
356
+ // an IP address. If addr is an IPv4 address, return the addr and error = nil .
356
357
// If addr is an IPv6 address, return the addr enclosed in square brackets and
357
- // ok = true .
358
- func formatIP (addr string ) (addrIP string , ok bool ) {
359
- ip := net . ParseIP (addr )
360
- if ip = = nil {
361
- return "" , false
358
+ // error = nil .
359
+ func formatIP (addr string ) (string , error ) {
360
+ ip , err := netip . ParseAddr (addr )
361
+ if err ! = nil {
362
+ return "" , err
362
363
}
363
- if ip .To4 () != nil {
364
- return addr , true
364
+ if ip .Is4 () {
365
+ return addr , nil
365
366
}
366
- return "[" + addr + "]" , true
367
+ return "[" + addr + "]" , nil
367
368
}
368
369
369
370
// parseTarget takes the user input target string and default port, returns
@@ -379,7 +380,7 @@ func parseTarget(target, defaultPort string) (host, port string, err error) {
379
380
if target == "" {
380
381
return "" , "" , internal .ErrMissingAddr
381
382
}
382
- if ip := net . ParseIP (target ); ip ! = nil {
383
+ if _ , err := netip . ParseAddr (target ); err = = nil {
383
384
// target is an IPv4 or IPv6(without brackets) address
384
385
return target , defaultPort , nil
385
386
}
0 commit comments