Skip to content

Commit 06d65bb

Browse files
committed
mcs: preserve advertise host with zero port
Signed-off-by: Ryan Leung <rleungx@gmail.com>
1 parent 2552141 commit 06d65bb

2 files changed

Lines changed: 41 additions & 4 deletions

File tree

pkg/mcs/server/server.go

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,15 @@ func ResolveListenAddr(listenAddr, actualListenAddr string) string {
186186
}
187187

188188
// ResolveAdvertiseListenAddr returns actualListenAddr when advertiseAddr was left
189-
// unspecified or still points at a kernel-selected port.
189+
// unspecified. If advertiseAddr points at a kernel-selected port, it preserves
190+
// the explicit advertise host and replaces only the port.
190191
func ResolveAdvertiseListenAddr(advertiseAddr, actualListenAddr string) string {
191-
if advertiseAddr == "" || hasZeroPort(advertiseAddr) {
192+
if advertiseAddr == "" {
192193
return actualListenAddr
193194
}
195+
if hasZeroPort(advertiseAddr) {
196+
return replacePort(advertiseAddr, actualListenAddr)
197+
}
194198
return advertiseAddr
195199
}
196200

@@ -237,11 +241,43 @@ func buildActualListenAddr(listenURL *url.URL, addr net.Addr) string {
237241
}
238242

239243
func hasZeroPort(addr string) bool {
244+
_, port, ok := splitHostPort(addr)
245+
return ok && port == "0"
246+
}
247+
248+
func replacePort(addr, actualListenAddr string) string {
249+
_, actualPort, ok := splitHostPort(actualListenAddr)
250+
if !ok {
251+
return actualListenAddr
252+
}
253+
254+
parsed, err := url.Parse(addr)
255+
if err == nil && parsed.Host != "" {
256+
host, _, ok := splitHostPort(parsed.Host)
257+
if !ok {
258+
return actualListenAddr
259+
}
260+
parsed.Host = net.JoinHostPort(host, actualPort)
261+
return parsed.String()
262+
}
263+
264+
host, _, ok := splitHostPort(addr)
265+
if !ok {
266+
return actualListenAddr
267+
}
268+
return net.JoinHostPort(host, actualPort)
269+
}
270+
271+
func splitHostPort(addr string) (string, string, bool) {
240272
parsed, err := url.Parse(addr)
241273
host := addr
242274
if err == nil && parsed.Host != "" {
243275
host = parsed.Host
244276
}
245277
_, port, err := net.SplitHostPort(host)
246-
return err == nil && port == "0"
278+
if err != nil {
279+
return "", "", false
280+
}
281+
host, _, err = net.SplitHostPort(host)
282+
return host, port, err == nil
247283
}

pkg/mcs/server/server_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ func TestResolveAdvertiseListenAddr(t *testing.T) {
5555

5656
require.Equal(t, actualAddr, ResolveAdvertiseListenAddr("", actualAddr))
5757
require.Equal(t, actualAddr, ResolveAdvertiseListenAddr("http://127.0.0.1:0", actualAddr))
58-
require.Equal(t, actualAddr, ResolveAdvertiseListenAddr("127.0.0.1:0", actualAddr))
58+
require.Equal(t, "http://10.0.0.5:12345", ResolveAdvertiseListenAddr("http://10.0.0.5:0", actualAddr))
59+
require.Equal(t, "127.0.0.1:12345", ResolveAdvertiseListenAddr("127.0.0.1:0", actualAddr))
5960
require.Equal(t, "http://127.0.0.1:23456", ResolveAdvertiseListenAddr("http://127.0.0.1:23456", actualAddr))
6061
}
6162

0 commit comments

Comments
 (0)