@@ -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.
190191func 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
239243func 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}
0 commit comments