From 758a88a8134d5bcf8f10d4acb23dc8b41090f90a Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Mon, 31 Aug 2020 15:35:55 +0300 Subject: [PATCH] rpc: exit from Start after Listener is running If port is dynamically allocated, `(*Server).Addr` will contain 0 port. This commit executes listener before exiting from `Start()` and sets Addr to the actual address. --- cli/server/server.go | 2 +- pkg/rpc/server/server.go | 22 ++++++++++++++++++---- pkg/rpc/server/server_helper_test.go | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/cli/server/server.go b/cli/server/server.go index ed5840d72..b4a874963 100644 --- a/cli/server/server.go +++ b/cli/server/server.go @@ -355,7 +355,7 @@ func startServer(ctx *cli.Context) error { errChan := make(chan error) go serv.Start(errChan) - go rpcServer.Start(errChan) + rpcServer.Start(errChan) fmt.Fprintln(ctx.App.Writer, logo()) fmt.Fprintln(ctx.App.Writer, serv.UserAgent) diff --git a/pkg/rpc/server/server.go b/pkg/rpc/server/server.go index 3617fcebd..6668e7510 100644 --- a/pkg/rpc/server/server.go +++ b/pkg/rpc/server/server.go @@ -167,18 +167,32 @@ func (s *Server) Start(errChan chan error) { s.https.Handler = http.HandlerFunc(s.handleHTTPRequest) s.log.Info("starting rpc-server (https)", zap.String("endpoint", s.https.Addr)) go func() { - err := s.https.ListenAndServeTLS(cfg.CertFile, cfg.KeyFile) + ln, err := net.Listen("tcp", s.https.Addr) + if err != nil { + errChan <- err + return + } + s.https.Addr = ln.Addr().String() + err = s.https.ServeTLS(ln, cfg.CertFile, cfg.KeyFile) if err != http.ErrServerClosed { s.log.Error("failed to start TLS RPC server", zap.Error(err)) errChan <- err } }() } - err := s.ListenAndServe() - if err != http.ErrServerClosed { - s.log.Error("failed to start RPC server", zap.Error(err)) + ln, err := net.Listen("tcp", s.Addr) + if err != nil { errChan <- err + return } + s.Addr = ln.Addr().String() // set Addr to the actual address + go func() { + err = s.Serve(ln) + if err != http.ErrServerClosed { + s.log.Error("failed to start RPC server", zap.Error(err)) + errChan <- err + } + }() } // Shutdown overrides the http.Server Shutdown diff --git a/pkg/rpc/server/server_helper_test.go b/pkg/rpc/server/server_helper_test.go index d10b473ee..1ea4ab6c4 100644 --- a/pkg/rpc/server/server_helper_test.go +++ b/pkg/rpc/server/server_helper_test.go @@ -68,7 +68,7 @@ func initClearServerWithInMemoryChain(t *testing.T) (*core.Blockchain, *Server, require.NoError(t, err) rpcServer := New(chain, cfg.ApplicationConfiguration.RPC, server, logger) errCh := make(chan error, 2) - go rpcServer.Start(errCh) + rpcServer.Start(errCh) handler := http.HandlerFunc(rpcServer.handleHTTPRequest) srv := httptest.NewServer(handler)