Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e16843c

Browse files
committed
Improve cancellation in sendEvent
1 parent ed0189c commit e16843c

File tree

1 file changed

+12
-3
lines changed

1 file changed

+12
-3
lines changed

coderd/httpapi/httpapi.go

+12-3
Original file line numberDiff line numberDiff line change
@@ -245,18 +245,27 @@ func ServerSentEventSender(rw http.ResponseWriter, r *http.Request) (sendEvent f
245245

246246
event := sseEvent{
247247
payload: buf.Bytes(),
248-
errC: make(chan error, 1),
248+
errC: make(chan error, 1), // Buffered to prevent deadlock.
249249
}
250250

251251
select {
252252
case <-r.Context().Done():
253253
return r.Context().Err()
254254
case <-ctx.Done():
255255
return ctx.Err()
256-
case eventC <- event:
257-
return <-event.errC
258256
case <-closed:
259257
return xerrors.New("server sent event sender closed")
258+
case eventC <- event:
259+
// Re-check closure signals after sending the event to allow
260+
// for early exit. We don't check closed here because it
261+
// can't happen while processing the event.
262+
select {
263+
case <-r.Context().Done():
264+
return r.Context().Err()
265+
case <-ctx.Done():
266+
return ctx.Err()
267+
case err := <-event.errC:
268+
return err
260269
}
261270
}
262271

0 commit comments

Comments
 (0)