pb: fix IPv6 double brackets in ServerAddress formatting (#8329)
* pb: fix IPv6 double brackets in ServerAddress formatting * pb: refactor IPv6 tests into table-driven test * util: add JoinHostPortStr and use it in pb to avoid unsafe port parsing
This commit is contained in:
@@ -57,7 +57,7 @@ func (sa ServerAddress) ToHttpAddress() string {
|
|||||||
sepIndex := strings.LastIndex(string(ports), ".")
|
sepIndex := strings.LastIndex(string(ports), ".")
|
||||||
if sepIndex >= 0 {
|
if sepIndex >= 0 {
|
||||||
host := string(sa[0:portsSepIndex])
|
host := string(sa[0:portsSepIndex])
|
||||||
return net.JoinHostPort(host, ports[0:sepIndex])
|
return util.JoinHostPortStr(host, ports[0:sepIndex])
|
||||||
}
|
}
|
||||||
return string(sa)
|
return string(sa)
|
||||||
}
|
}
|
||||||
@@ -74,7 +74,7 @@ func (sa ServerAddress) ToGrpcAddress() string {
|
|||||||
sepIndex := strings.LastIndex(ports, ".")
|
sepIndex := strings.LastIndex(ports, ".")
|
||||||
if sepIndex >= 0 {
|
if sepIndex >= 0 {
|
||||||
host := string(sa[0:portsSepIndex])
|
host := string(sa[0:portsSepIndex])
|
||||||
return net.JoinHostPort(host, ports[sepIndex+1:])
|
return util.JoinHostPortStr(host, ports[sepIndex+1:])
|
||||||
}
|
}
|
||||||
return ServerToGrpcAddress(string(sa))
|
return ServerToGrpcAddress(string(sa))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,3 +34,36 @@ func TestServerAddresses_ToAddressMapOrSrv_shouldHandleIPPortList(t *testing.T)
|
|||||||
t.Fatalf(`Expected %q, got %q`, expected, d.list)
|
t.Fatalf(`Expected %q, got %q`, expected, d.list)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIPv6ServerAddressFormatting(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
name string
|
||||||
|
sa ServerAddress
|
||||||
|
expectedHttp string
|
||||||
|
expectedGrpc string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "unbracketed IPv6",
|
||||||
|
sa: NewServerAddress("2001:db8::1", 8080, 18080),
|
||||||
|
expectedHttp: "[2001:db8::1]:8080",
|
||||||
|
expectedGrpc: "[2001:db8::1]:18080",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "bracketed IPv6",
|
||||||
|
sa: NewServerAddressWithGrpcPort("[2001:db8::1]:8080", 18080),
|
||||||
|
expectedHttp: "[2001:db8::1]:8080",
|
||||||
|
expectedGrpc: "[2001:db8::1]:18080",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
if httpAddr := tc.sa.ToHttpAddress(); httpAddr != tc.expectedHttp {
|
||||||
|
t.Errorf("%s: ToHttpAddress() = %s, want %s", tc.name, httpAddr, tc.expectedHttp)
|
||||||
|
}
|
||||||
|
if grpcAddr := tc.sa.ToGrpcAddress(); grpcAddr != tc.expectedGrpc {
|
||||||
|
t.Errorf("%s: ToGrpcAddress() = %s, want %s", tc.name, grpcAddr, tc.expectedGrpc)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -58,11 +58,14 @@ func selectIpV4(netInterfaces []net.Interface, isIpV4 bool) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func JoinHostPort(host string, port int) string {
|
func JoinHostPort(host string, port int) string {
|
||||||
portStr := strconv.Itoa(port)
|
return JoinHostPortStr(host, strconv.Itoa(port))
|
||||||
|
}
|
||||||
|
|
||||||
|
func JoinHostPortStr(host string, port string) string {
|
||||||
if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
|
if strings.HasPrefix(host, "[") && strings.HasSuffix(host, "]") {
|
||||||
return host + ":" + portStr
|
return host + ":" + port
|
||||||
}
|
}
|
||||||
return net.JoinHostPort(host, portStr)
|
return net.JoinHostPort(host, port)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetVolumeServerId returns the volume server ID.
|
// GetVolumeServerId returns the volume server ID.
|
||||||
|
|||||||
Reference in New Issue
Block a user