@@ -45,6 +45,7 @@ type BaseServer struct {
4545 clientConns sync.Map
4646 secure bool
4747 muxListener net.Listener
48+ listenAddr string
4849 // Callback functions for different stages
4950 // startCallbacks will be called after the server is started.
5051 startCallbacks []func ()
@@ -158,14 +159,41 @@ func (bs *BaseServer) InitListener(tlsCfg *grpcutil.TLSConfig, listenAddr string
158159 } else {
159160 bs .muxListener , err = net .Listen (constant .TCPNetworkStr , listenURL .Host )
160161 }
161- return err
162+ if err != nil {
163+ return err
164+ }
165+ bs .listenAddr = buildActualListenAddr (listenURL , bs .muxListener .Addr ())
166+ return nil
162167}
163168
164169// GetListener returns the listener.
165170func (bs * BaseServer ) GetListener () net.Listener {
166171 return bs .muxListener
167172}
168173
174+ // GetActualListenAddr returns the listener address after binding.
175+ func (bs * BaseServer ) GetActualListenAddr () string {
176+ return bs .listenAddr
177+ }
178+
179+ // ResolveListenAddr returns actualListenAddr only when listenAddr points at a
180+ // kernel-selected port.
181+ func ResolveListenAddr (listenAddr , actualListenAddr string ) string {
182+ if hasZeroPort (listenAddr ) {
183+ return actualListenAddr
184+ }
185+ return listenAddr
186+ }
187+
188+ // ResolveAdvertiseListenAddr returns actualListenAddr when advertiseAddr was left
189+ // unspecified or still points at a kernel-selected port.
190+ func ResolveAdvertiseListenAddr (advertiseAddr , actualListenAddr string ) string {
191+ if advertiseAddr == "" || hasZeroPort (advertiseAddr ) {
192+ return actualListenAddr
193+ }
194+ return advertiseAddr
195+ }
196+
169197// IsSecure checks if the server enable TLS.
170198func (bs * BaseServer ) IsSecure () bool {
171199 return bs .secure
@@ -186,3 +214,30 @@ func (bs *BaseServer) CloseClientConns() {
186214 return true
187215 })
188216}
217+
218+ func buildActualListenAddr (listenURL * url.URL , addr net.Addr ) string {
219+ host , _ , err := net .SplitHostPort (listenURL .Host )
220+ if err != nil || host == "" {
221+ host , _ , _ = net .SplitHostPort (addr .String ())
222+ }
223+ if ip := net .ParseIP (host ); ip != nil && ip .IsUnspecified () {
224+ host = "127.0.0.1"
225+ }
226+ _ , port , err := net .SplitHostPort (addr .String ())
227+ if err != nil {
228+ return listenURL .String ()
229+ }
230+ actualURL := * listenURL
231+ actualURL .Host = net .JoinHostPort (host , port )
232+ return actualURL .String ()
233+ }
234+
235+ func hasZeroPort (addr string ) bool {
236+ parsed , err := url .Parse (addr )
237+ host := addr
238+ if err == nil && parsed .Host != "" {
239+ host = parsed .Host
240+ }
241+ _ , port , err := net .SplitHostPort (host )
242+ return err == nil && port == "0"
243+ }
0 commit comments