diff options
author | Runxi Yu <me@runxiyu.org> | 2025-08-17 04:48:47 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-08-17 05:22:09 +0800 |
commit | b6dd3ffce416fa86c223fad5d2f6c3db5d5727e4 (patch) | |
tree | f3cc533b1ef5184ee881d9d0103a47ec7f09bd34 /forged/internal/incoming/web | |
parent | Add shutdown timeouts (diff) | |
download | forge-b6dd3ffce416fa86c223fad5d2f6c3db5d5727e4.tar.gz forge-b6dd3ffce416fa86c223fad5d2f6c3db5d5727e4.tar.zst forge-b6dd3ffce416fa86c223fad5d2f6c3db5d5727e4.zip |
A few other context fixes
Diffstat (limited to 'forged/internal/incoming/web')
-rw-r--r-- | forged/internal/incoming/web/web.go | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/forged/internal/incoming/web/web.go b/forged/internal/incoming/web/web.go index 391f6ff..dc2d9b4 100644 --- a/forged/internal/incoming/web/web.go +++ b/forged/internal/incoming/web/web.go @@ -3,6 +3,7 @@ package web import ( "context" "fmt" + "net" "net/http" "time" @@ -53,21 +54,26 @@ func New(config Config) (server *Server) { } func (server *Server) Run(ctx context.Context) (err error) { + server.httpServer.BaseContext = func(_ net.Listener) context.Context { return ctx } + listener, err := misc.Listen(server.net, server.addr) + if err != nil { + return fmt.Errorf("listen for web: %w", err) + } defer func() { _ = listener.Close() }() - go func() { - <-ctx.Done() - shCtx, cancel := context.WithTimeout(context.Background(), time.Duration(server.shutdownTimeout)*time.Second) + stop := context.AfterFunc(ctx, func() { + shCtx, cancel := context.WithTimeout(context.WithoutCancel(ctx), time.Duration(server.shutdownTimeout)*time.Second) defer cancel() _ = server.httpServer.Shutdown(shCtx) _ = listener.Close() - }() + }) + defer stop() if err = server.httpServer.Serve(listener); err != nil { - if err == http.ErrServerClosed { + if err == http.ErrServerClosed || ctx.Err() != nil { return nil } return fmt.Errorf("serve web: %w", err) |