feat: release v0.27 unified HTTP limits and safe request shutdown

This commit is contained in:
2026-09-29 23:24:19 +08:00
parent 859f1851b1
commit 3b00bb55d1
42 changed files with 1191 additions and 70 deletions

View File

@@ -247,3 +247,29 @@ func TestCanceledServeContextWaitsForShutdownDeadline(t *testing.T) {
}
waitSignal(t, canceled)
}
func TestShutdownWaitsForHandlerAfterClientDisconnect(t *testing.T) {
started, canceled, release, finished := make(chan struct{}), make(chan struct{}), make(chan struct{}), make(chan struct{})
s := New(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) {
defer close(finished)
close(started)
<-r.Context().Done()
close(canceled)
<-release
}))
defer func() { close(release); waitSignal(t, finished) }()
address, done := launchServer(t, s, context.Background())
p := newFramePeer(t, address)
p.get(t, 1, "/hold")
waitSignal(t, started)
p.Close()
waitSignal(t, canceled)
ctx, cancel := context.WithTimeout(context.Background(), 40*time.Millisecond)
defer cancel()
if err := s.Shutdown(ctx); !errors.Is(err, context.DeadlineExceeded) {
t.Fatalf("disconnected handler reported as drained: %v", err)
}
// Serve can finish its bounded shutdown, but successful Shutdown must never
// imply that a disconnected, still-running handler has completed.
_ = serveResult(t, done)
}