You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by we...@apache.org on 2021/07/01 12:45:30 UTC

[rocketmq-client-go] branch master updated: [ISSUE #695] Feat: support IPV6 (#641)

This is an automated email from the ASF dual-hosted git repository.

wenfeng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/rocketmq-client-go.git


The following commit(s) were added to refs/heads/master by this push:
     new e69e907  [ISSUE #695] Feat: support IPV6 (#641)
e69e907 is described below

commit e69e9074e6d49ea4060ae43e46502cb80cd65b25
Author: 徐旭 <12...@qq.com>
AuthorDate: Thu Jul 1 20:45:22 2021 +0800

    [ISSUE #695] Feat: support IPV6 (#641)
    
    * support ipv6
---
 primitive/base.go      | 11 +++++++----
 primitive/base_test.go | 12 ++++++++++++
 primitive/message.go   | 35 ++++++++++++++++++++++++++---------
 primitive/result.go    |  6 ++++--
 4 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/primitive/base.go b/primitive/base.go
index 35b6268..fca34a2 100644
--- a/primitive/base.go
+++ b/primitive/base.go
@@ -23,7 +23,8 @@ import (
 )
 
 var (
-	ipRegex, _ = regexp.Compile(`^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))`)
+	ipv4Regex, _ = regexp.Compile(`^((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))`)
+	ipv6Regex, _ = regexp.Compile(`(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0 [...]
 )
 
 type NamesrvAddr []string
@@ -70,12 +71,14 @@ func verifyIP(ip string) error {
 	if strings.Contains(ip, ";") {
 		return ErrMultiIP
 	}
-	ips := ipRegex.FindAllString(ip, -1)
-	if len(ips) == 0 {
+	ipV4s := ipv4Regex.FindAllString(ip, -1)
+	ipV6s := ipv6Regex.FindAllString(ip, -1)
+
+	if len(ipV4s) == 0 && len(ipV6s) == 0 {
 		return ErrIllegalIP
 	}
 
-	if len(ips) > 1 {
+	if len(ipV4s) > 1 || len(ipV6s) > 1 {
 		return ErrMultiIP
 	}
 	return nil
diff --git a/primitive/base_test.go b/primitive/base_test.go
index 03a978d..db947c4 100644
--- a/primitive/base_test.go
+++ b/primitive/base_test.go
@@ -43,6 +43,18 @@ func TestVerifyIP(t *testing.T) {
 	IPs = "127.0.0.1:9876;12.24.123.243:10911"
 	err = verifyIP(IPs)
 	assert.Equal(t, "multiple IP addr does not support", err.Error())
+
+	IPs = "bdbd:bdbd:ff:1:1:2:3:4:8888"
+	err = verifyIP(IPs)
+	assert.Nil(t, err)
+
+	IPs = "[bdbd:bdbd:ff:1:1:2:3:4]:8888"
+	err = verifyIP(IPs)
+	assert.Nil(t, err)
+
+	IPs = "[bdbd:bdbd:ff:1:1:2:3:4]:8888;[bdbd:bdbd:ff:1:1:2:3:4]:8889"
+	err = verifyIP(IPs)
+	assert.Equal(t, "multiple IP addr does not support", err.Error())
 }
 
 func TestBase(t *testing.T) {
diff --git a/primitive/message.go b/primitive/message.go
index b330dc1..b8e8f83 100644
--- a/primitive/message.go
+++ b/primitive/message.go
@@ -320,22 +320,39 @@ func DecodeMessage(data []byte) []*MessageExt {
 		binary.Read(buf, binary.BigEndian, &msg.BornTimestamp)
 		count += 8
 
+		var (
+			port      int32
+			hostBytes []byte
+		)
 		// 10. born host
-		hostBytes := buf.Next(4)
-		var port int32
-		binary.Read(buf, binary.BigEndian, &port)
-		msg.BornHost = fmt.Sprintf("%s:%d", utils.GetAddressByBytes(hostBytes), port)
-		count += 8
+		if msg.SysFlag&FlagBornHostV6 == FlagBornHostV6 {
+			hostBytes = buf.Next(16)
+			binary.Read(buf, binary.BigEndian, &port)
+			msg.BornHost = fmt.Sprintf("%s:%d", utils.GetAddressByBytes(hostBytes), port)
+			count += 20
+		} else {
+			hostBytes = buf.Next(4)
+			binary.Read(buf, binary.BigEndian, &port)
+			msg.BornHost = fmt.Sprintf("%s:%d", utils.GetAddressByBytes(hostBytes), port)
+			count += 8
+		}
 
 		// 11. store timestamp
 		binary.Read(buf, binary.BigEndian, &msg.StoreTimestamp)
 		count += 8
 
 		// 12. store host
-		hostBytes = buf.Next(4)
-		binary.Read(buf, binary.BigEndian, &port)
-		msg.StoreHost = fmt.Sprintf("%s:%d", utils.GetAddressByBytes(hostBytes), port)
-		count += 8
+		if msg.SysFlag&FlagStoreHostV6 == FlagStoreHostV6 {
+			hostBytes = buf.Next(16)
+			binary.Read(buf, binary.BigEndian, &port)
+			msg.StoreHost = fmt.Sprintf("%s:%d", utils.GetAddressByBytes(hostBytes), port)
+			count += 20
+		} else {
+			hostBytes = buf.Next(4)
+			binary.Read(buf, binary.BigEndian, &port)
+			msg.StoreHost = fmt.Sprintf("%s:%d", utils.GetAddressByBytes(hostBytes), port)
+			count += 8
+		}
 
 		// 13. reconsume times
 		binary.Read(buf, binary.BigEndian, &msg.ReconsumeTimes)
diff --git a/primitive/result.go b/primitive/result.go
index b3d6479..20d393a 100644
--- a/primitive/result.go
+++ b/primitive/result.go
@@ -31,8 +31,10 @@ const (
 	SendSlaveNotAvailable
 	SendUnknownError
 
-	FlagCompressed = 0x1
-	MsgIdLength    = 8 + 8
+	FlagCompressed  = 0x1
+	FlagBornHostV6  = 0x1 << 4
+	FlagStoreHostV6 = 0x1 << 5
+	MsgIdLength     = 8 + 8
 
 	propertySeparator  = '\002'
 	nameValueSeparator = '\001'