mirror of
https://gitee.com/johng/gf
synced 2026-06-07 02:12:11 +08:00
fix data race in UT cases for package ghttp
This commit is contained in:
@ -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
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user