Add some error logging in Listener.Serve(). (#303)

* Add some error logging in Listener.Serve().

* Remove error logging for TCP listener Accept() calls.

* Optimize code.

---------

Co-authored-by: JB <28275108+mochi-co@users.noreply.github.com>
This commit is contained in:
werbenhu
2023-09-30 01:55:47 +08:00
committed by GitHub
parent a5310bdfdf
commit 0d880fa9bd
4 changed files with 67 additions and 5 deletions

View File

@@ -25,6 +25,7 @@ type HTTPStats struct {
config *Config // configuration values for the listener
listen *http.Server // the http server
sysInfo *system.Info // pointers to the server data
log *slog.Logger // server logger
end uint32 // ensure the close methods are only called once
}
@@ -61,7 +62,8 @@ func (l *HTTPStats) Protocol() string {
}
// Init initializes the listener.
func (l *HTTPStats) Init(_ *slog.Logger) error {
func (l *HTTPStats) Init(log *slog.Logger) error {
l.log = log
mux := http.NewServeMux()
mux.HandleFunc("/", l.jsonHandler)
l.listen = &http.Server{
@@ -80,10 +82,17 @@ func (l *HTTPStats) Init(_ *slog.Logger) error {
// Serve starts listening for new connections and serving responses.
func (l *HTTPStats) Serve(establish EstablishFn) {
var err error
if l.listen.TLSConfig != nil {
_ = l.listen.ListenAndServeTLS("", "")
err = l.listen.ListenAndServeTLS("", "")
} else {
_ = l.listen.ListenAndServe()
err = l.listen.ListenAndServe()
}
// After the listener has been shutdown, no need to print the http.ErrServerClosed error.
if err != nil && atomic.LoadUint32(&l.end) == 0 {
l.log.Error("failed to serve.", "error", err, "listener", l.id)
}
}

View File

@@ -125,3 +125,28 @@ func TestHTTPStatsServeTLSAndClose(t *testing.T) {
time.Sleep(time.Millisecond)
l.Close(MockCloser)
}
func TestHTTPStatsFailedToServe(t *testing.T) {
sysInfo := &system.Info{
Version: "test",
}
// setup http stats listener
l := NewHTTPStats("t1", "wrong_addr", nil, sysInfo)
err := l.Init(logger)
require.NoError(t, err)
o := make(chan bool)
go func(o chan bool) {
l.Serve(MockEstablisher)
o <- true
}(o)
<-o
// ensure listening is closed
var closed bool
l.Close(func(id string) {
closed = true
})
require.Equal(t, true, closed)
}

View File

@@ -109,12 +109,18 @@ func (l *Websocket) handler(w http.ResponseWriter, r *http.Request) {
// Serve starts waiting for new Websocket connections, and calls the connection
// establishment callback for any received.
func (l *Websocket) Serve(establish EstablishFn) {
var err error
l.establish = establish
if l.listen.TLSConfig != nil {
_ = l.listen.ListenAndServeTLS("", "")
err = l.listen.ListenAndServeTLS("", "")
} else {
_ = l.listen.ListenAndServe()
err = l.listen.ListenAndServe()
}
// After the listener has been shutdown, no need to print the http.ErrServerClosed error.
if err != nil && atomic.LoadUint32(&l.end) == 0 {
l.log.Error("failed to serve.", "error", err, "listener", l.id)
}
}

View File

@@ -92,6 +92,28 @@ func TestWebsocketServeTLSAndClose(t *testing.T) {
closed = true
})
require.Equal(t, true, closed)
<-o
}
func TestWebsocketFailedToServe(t *testing.T) {
l := NewWebsocket("t1", "wrong_addr", &Config{
TLSConfig: tlsConfigBasic,
})
err := l.Init(logger)
require.NoError(t, err)
o := make(chan bool)
go func(o chan bool) {
l.Serve(MockEstablisher)
o <- true
}(o)
<-o
var closed bool
l.Close(func(id string) {
closed = true
})
require.Equal(t, true, closed)
}
func TestWebsocketUpgrade(t *testing.T) {