From 4b3206c3147b606859f7b59b556df1ca02924a5b Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 8 Nov 2021 17:06:56 +0100 Subject: [PATCH] Add IPFromAddr to netutils --- network/netutils/address.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 network/netutils/address.go diff --git a/network/netutils/address.go b/network/netutils/address.go new file mode 100644 index 00000000..86a94995 --- /dev/null +++ b/network/netutils/address.go @@ -0,0 +1,30 @@ +package netutils + +import ( + "fmt" + "net" +) + +// IPFromAddr extracts or parses the IP address contained in the given address. +func IPFromAddr(addr net.Addr) (net.IP, error) { + // Convert addr to IP if needed. + switch v := addr.(type) { + case *net.TCPAddr: + return v.IP, nil + case *net.UDPAddr: + return v.IP, nil + case *net.IPAddr: + return v.IP, nil + default: + // Parse via string. + host, _, err := net.SplitHostPort(addr.String()) + if err != nil { + return nil, fmt.Errorf("failed to split host and port of %q: %s", addr, err) + } + ip := net.ParseIP(host) + if ip == nil { + return nil, fmt.Errorf("address %q does not contain a valid IP address", addr) + } + return ip, nil + } +}