diff --git a/error.go b/error.go index 8a59913be..c80f2d882 100644 --- a/error.go +++ b/error.go @@ -3,6 +3,7 @@ package redis import ( "context" "errors" + "github.com/redis/go-redis/v9/internal" "io" "net" "strings" @@ -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..ee96d73c4 100644 --- a/internal/util.go +++ b/internal/util.go @@ -2,6 +2,7 @@ package internal import ( "context" + "net" "strings" "time" @@ -64,3 +65,22 @@ func ReplaceSpaces(s string) string { return builder.String() } + +func GetAddr(addr string) string { + ind := strings.LastIndex(addr, ":") + if ind == -1 { + return "" + } + + port := addr[ind+1:] + host := addr[:ind] + if string(host[0]) == "[" && string(host[len(host)-1]) == "]" { + host = host[1 : len(host)-1] + } + + if net.ParseIP(host) == nil { + return "" + } + + return net.JoinHostPort(host, port) +} 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("")) + }) +}