diff --git a/common/net/address.go b/common/net/address.go index 5918cf415..da15b803b 100644 --- a/common/net/address.go +++ b/common/net/address.go @@ -70,6 +70,10 @@ type Address interface { String() string // String representation of this Address } +func isAlphaNum(c byte) bool { + return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') +} + // 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 { @@ -77,8 +81,12 @@ func ParseAddress(addr string) Address { lenAddr := len(addr) if lenAddr > 0 && addr[0] == '[' && addr[lenAddr-1] == ']' { addr = addr[1 : lenAddr-1] + lenAddr -= 2 + } + + if lenAddr > 0 && (!isAlphaNum(addr[0]) || !isAlphaNum(addr[len(addr)-1])) { + addr = strings.TrimSpace(addr) } - addr = strings.TrimSpace(addr) ip := net.ParseIP(addr) if ip != nil { diff --git a/common/net/address_test.go b/common/net/address_test.go index 9c2ab9c8a..567ff506c 100644 --- a/common/net/address_test.go +++ b/common/net/address_test.go @@ -101,3 +101,21 @@ func TestIPOrDomain(t *testing.T) { assert(NewIPOrDomain(ParseAddress("8.8.8.8")).AsAddress(), Equals, ParseAddress("8.8.8.8")) assert(NewIPOrDomain(ParseAddress("2001:4860:0:2001::68")).AsAddress(), Equals, ParseAddress("2001:4860:0:2001::68")) } + +func BenchmarkParseAddressIPv4(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = ParseAddress("8.8.8.8") + } +} + +func BenchmarkParseAddressIPv6(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = ParseAddress("2001:4860:0:2001::68") + } +} + +func BenchmarkParseAddressDomain(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = ParseAddress("v2ray.com") + } +}