diff --git a/net/ghttp/ghttp_server.go b/net/ghttp/ghttp_server.go index 4ddecfe3e..f036c121d 100644 --- a/net/ghttp/ghttp_server.go +++ b/net/ghttp/ghttp_server.go @@ -10,7 +10,6 @@ import ( "bytes" "context" "fmt" - "net" "net/http" "os" "runtime" @@ -616,7 +615,7 @@ func (s *Server) GetListenedPort() int { func (s *Server) GetListenedPorts() []int { ports := make([]int, 0) for _, server := range s.servers { - ports = append(ports, server.rawListener.Addr().(*net.TCPAddr).Port) + ports = append(ports, server.GetListenedPort()) } return ports } diff --git a/net/ghttp/ghttp_server_graceful.go b/net/ghttp/ghttp_server_graceful.go index de5d8c956..1eaad5321 100644 --- a/net/ghttp/ghttp_server_graceful.go +++ b/net/ghttp/ghttp_server_graceful.go @@ -13,6 +13,7 @@ import ( "net" "net/http" "os" + "sync" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/os/gproc" @@ -27,6 +28,7 @@ type gracefulServer struct { address string // Listening address like:":80", ":8080". httpServer *http.Server // Underlying http.Server. rawListener net.Listener // Underlying net.Listener. + rawLnMu sync.RWMutex // Concurrent safety mutex for `rawListener`. listener net.Listener // Wrapped net.Listener. isHttps bool // Is HTTPS. status int // Status of current server. @@ -72,15 +74,15 @@ func (s *gracefulServer) ListenAndServe() error { return err } s.listener = ln - s.rawListener = ln + s.setRawListener(ln) return s.doServe(context.TODO()) } // Fd retrieves and returns the file descriptor of current server. -// It is available ony in *nix like operation systems like: linux, unix, darwin. +// It is available ony in *nix like operating systems like: linux, unix, darwin. func (s *gracefulServer) Fd() uintptr { - if s.rawListener != nil { - file, err := s.rawListener.(*net.TCPListener).File() + if ln := s.getRawListener(); ln != nil { + file, err := ln.(*net.TCPListener).File() if err == nil { return file.Fd() } @@ -111,7 +113,7 @@ func (s *gracefulServer) ListenAndServeTLS(certFile, keyFile string, tlsConfig . if config.NextProtos == nil { config.NextProtos = []string{"http/1.1"} } - err := error(nil) + var err error if len(config.Certificates) == 0 { config.Certificates = make([]tls.Certificate, 1) if gres.Contains(certFile) { @@ -133,10 +135,18 @@ func (s *gracefulServer) ListenAndServeTLS(certFile, keyFile string, tlsConfig . } s.listener = tls.NewListener(ln, config) - s.rawListener = ln + s.setRawListener(ln) return s.doServe(ctx) } +// GetListenedPort retrieves and returns one port which is listened by current server. +func (s *gracefulServer) GetListenedPort() int { + if ln := s.getRawListener(); ln != nil { + return ln.Addr().(*net.TCPAddr).Port + } + return 0 +} + // getProto retrieves and returns the proto string of current server. func (s *gracefulServer) getProto() string { proto := "http" @@ -199,6 +209,20 @@ func (s *gracefulServer) shutdown(ctx context.Context) { } } +// setRawListener sets `rawListener` with given net.Listener. +func (s *gracefulServer) setRawListener(ln net.Listener) { + s.rawLnMu.Lock() + defer s.rawLnMu.Unlock() + s.rawListener = ln +} + +// setRawListener returns the `rawListener` of current server. +func (s *gracefulServer) getRawListener() net.Listener { + s.rawLnMu.RLock() + defer s.rawLnMu.RUnlock() + return s.rawListener +} + // close shuts down the server forcibly. func (s *gracefulServer) close(ctx context.Context) { if s.status == ServerStatusStopped { diff --git a/net/ghttp/ghttp_z_unit_feature_error_code_test.go b/net/ghttp/ghttp_z_unit_feature_error_code_test.go index 0b087bac2..fbf625fd0 100644 --- a/net/ghttp/ghttp_z_unit_feature_error_code_test.go +++ b/net/ghttp/ghttp_z_unit_feature_error_code_test.go @@ -34,6 +34,7 @@ func Test_Error_Code(t *testing.T) { panic(gerror.NewCode(gcode.New(10000, "", nil), "test error")) }) }) + s.SetDumpRouterMap(false) s.Start() defer s.Shutdown() time.Sleep(100 * time.Millisecond) diff --git a/net/ghttp/ghttp_z_unit_feature_static_test.go b/net/ghttp/ghttp_z_unit_feature_static_test.go index 93d87c7d6..da5e5df90 100644 --- a/net/ghttp/ghttp_z_unit_feature_static_test.go +++ b/net/ghttp/ghttp_z_unit_feature_static_test.go @@ -258,6 +258,7 @@ func Test_Static_Rewrite(t *testing.T) { "/my-test1": "/test1.html", "/my-test2": "/test2.html", }) + s.SetDumpRouterMap(false) s.Start() defer s.Shutdown() time.Sleep(100 * time.Millisecond)