From dd159cce6caed9b3249019da59aca290b6569bdb Mon Sep 17 00:00:00 2001 From: Darien Raymond Date: Tue, 21 Nov 2017 18:46:28 +0100 Subject: [PATCH] special handling for IPv6 from URL --- common/net/address.go | 6 ++++++ common/net/address_test.go | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/common/net/address.go b/common/net/address.go index 583cebf8..993bf814 100644 --- a/common/net/address.go +++ b/common/net/address.go @@ -73,6 +73,12 @@ type Address interface { // ParseAddress parses a string into an Address. The return value will be an IPAddress when // the string is in the form of IPv4 or IPv6 address, or a DomainAddress otherwise. func ParseAddress(addr string) Address { + // Handle IPv6 address in form as "[2001:4860:0:2001::68]" + lenAddr := len(addr) + if lenAddr > 0 && addr[0] == '[' && addr[lenAddr-1] == ']' { + addr = addr[1 : lenAddr-1] + } + ip := net.ParseIP(addr) if ip != nil { return IPAddress(ip) diff --git a/common/net/address_test.go b/common/net/address_test.go index 3f5fcb42..2e8715c3 100644 --- a/common/net/address_test.go +++ b/common/net/address_test.go @@ -73,3 +73,15 @@ func TestNetIPv4Address(t *testing.T) { assert(addr, IsIPv4) assert(addr.String(), Equals, "1.2.3.4") } + +func TestParseIPv6Address(t *testing.T) { + assert := With(t) + + ip := ParseAddress("[2001:4860:0:2001::68]") + assert(ip, IsIPv6) + assert(ip.String(), Equals, "[2001:4860:0:2001::68]") + + ip = ParseAddress("[::ffff:123.151.71.143]") + assert(ip, IsIPv4) + assert(ip.String(), Equals, "123.151.71.143") +}