Browse Source

improve parse address performance

Darien Raymond 7 years ago
parent
commit
21e9a04dca
2 changed files with 27 additions and 1 deletions
  1. 9 1
      common/net/address.go
  2. 18 0
      common/net/address_test.go

+ 9 - 1
common/net/address.go

@@ -70,6 +70,10 @@ type Address interface {
 	String() string // String representation of this Address
 	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
 // 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.
 // the string is in the form of IPv4 or IPv6 address, or a DomainAddress otherwise.
 func ParseAddress(addr string) Address {
 func ParseAddress(addr string) Address {
@@ -77,8 +81,12 @@ func ParseAddress(addr string) Address {
 	lenAddr := len(addr)
 	lenAddr := len(addr)
 	if lenAddr > 0 && addr[0] == '[' && addr[lenAddr-1] == ']' {
 	if lenAddr > 0 && addr[0] == '[' && addr[lenAddr-1] == ']' {
 		addr = addr[1 : 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)
 	ip := net.ParseIP(addr)
 	if ip != nil {
 	if ip != nil {

+ 18 - 0
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("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"))
 	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")
+	}
+}