diff --git a/error.go b/error.go index 8a59913be..9b348193a 100644 --- a/error.go +++ b/error.go @@ -7,6 +7,7 @@ import ( "net" "strings" + "github.com/redis/go-redis/v9/internal" "github.com/redis/go-redis/v9/internal/pool" "github.com/redis/go-redis/v9/internal/proto" ) @@ -129,7 +130,9 @@ func isMovedError(err error) (moved bool, ask bool, addr string) { if ind == -1 { return false, false, "" } + addr = s[ind+1:] + addr = internal.GetAddr(addr) return } diff --git a/internal/util.go b/internal/util.go index ed81ad7aa..235a91afa 100644 --- a/internal/util.go +++ b/internal/util.go @@ -2,6 +2,7 @@ package internal import ( "context" + "net" "strings" "time" @@ -64,3 +65,19 @@ func ReplaceSpaces(s string) string { return builder.String() } + +func GetAddr(addr string) string { + ind := strings.LastIndexByte(addr, ':') + if ind == -1 { + return "" + } + + if strings.IndexByte(addr, '.') != -1 { + return addr + } + + if addr[0] == '[' { + return addr + } + return net.JoinHostPort(addr[:ind], addr[ind+1:]) +} diff --git a/internal/util_test.go b/internal/util_test.go index f090ebaa4..57f7f9fa1 100644 --- a/internal/util_test.go +++ b/internal/util_test.go @@ -51,3 +51,24 @@ func TestIsLower(t *testing.T) { Expect(isLower(str)).To(BeTrue()) }) } + +func TestGetAddr(t *testing.T) { + It("getAddr", func() { + str := "127.0.0.1:1234" + Expect(GetAddr(str)).To(Equal(str)) + + str = "[::1]:1234" + Expect(GetAddr(str)).To(Equal(str)) + + str = "[fd01:abcd::7d03]:6379" + Expect(GetAddr(str)).To(Equal(str)) + + Expect(GetAddr("::1:1234")).To(Equal("[::1]:1234")) + + Expect(GetAddr("fd01:abcd::7d03:6379")).To(Equal("[fd01:abcd::7d03]:6379")) + + Expect(GetAddr("127.0.0.1")).To(Equal("")) + + Expect(GetAddr("127")).To(Equal("")) + }) +}