Skip to content

Commit 6f1ae10

Browse files
committed
Serve does not return http.ErrServerClosed anymore, handle graceful shutdown properly
1 parent ff6eb04 commit 6f1ae10

2 files changed

Lines changed: 12 additions & 6 deletions

File tree

echo.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -727,10 +727,7 @@ func (e *Echo) Start(address string) error {
727727
sc := StartConfig{Address: address}
728728
ctx, cancel := signal.NotifyContext(stdContext.Background(), os.Interrupt, syscall.SIGTERM) // start shutdown process on ctrl+c
729729
defer cancel()
730-
if err := sc.Start(ctx, e); err != nil && !errors.Is(err, http.ErrServerClosed) {
731-
return err
732-
}
733-
return nil
730+
return sc.Start(ctx, e)
734731
}
735732

736733
// WrapHandler wraps `http.Handler` into `echo.HandlerFunc`.

server.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package echo
66
import (
77
stdContext "context"
88
"crypto/tls"
9+
"errors"
910
"fmt"
1011
"io/fs"
1112
"log/slog"
@@ -138,8 +139,16 @@ func (sc StartConfig) start(ctx stdContext.Context, h http.Handler) error {
138139
logger.Info("http(s) server started", "address", listener.Addr().String())
139140
}
140141

141-
go gracefulShutdown(ctx, &sc, &server, logger)
142-
return server.Serve(listener)
142+
if sc.GracefulTimeout >= 0 {
143+
gCtx, cancel := stdContext.WithCancel(ctx) // end goroutine when Serve returns early
144+
defer cancel()
145+
go gracefulShutdown(gCtx, &sc, &server, logger)
146+
}
147+
148+
if err := server.Serve(listener); err != nil && !errors.Is(err, http.ErrServerClosed) {
149+
return err
150+
}
151+
return nil
143152
}
144153

145154
func filepathOrContent(fileOrContent any, certFilesystem fs.FS) (content []byte, err error) {

0 commit comments

Comments
 (0)