@@ -250,10 +250,14 @@ func (o *ServeConnOpts) handler() http.Handler {
250
250
//
251
251
// The opts parameter is optional. If nil, default values are used.
252
252
func (s * Server ) ServeConn (c net.Conn , opts * ServeConnOpts ) {
253
+ baseCtx , cancel := serverConnBaseContext (c , opts )
254
+ defer cancel ()
255
+
253
256
sc := & serverConn {
254
257
srv : s ,
255
258
hs : opts .baseConfig (),
256
259
conn : c ,
260
+ baseCtx : baseCtx ,
257
261
remoteAddrStr : c .RemoteAddr ().String (),
258
262
bw : newBufferedWriter (c ),
259
263
handler : opts .handler (),
@@ -272,6 +276,7 @@ func (s *Server) ServeConn(c net.Conn, opts *ServeConnOpts) {
272
276
serveG : newGoroutineLock (),
273
277
pushEnabled : true ,
274
278
}
279
+
275
280
sc .flow .add (initialWindowSize )
276
281
sc .inflow .add (initialWindowSize )
277
282
sc .hpackEncoder = hpack .NewEncoder (& sc .headerWriteBuf )
@@ -373,6 +378,7 @@ type serverConn struct {
373
378
conn net.Conn
374
379
bw * bufferedWriter // writing to conn
375
380
handler http.Handler
381
+ baseCtx contextContext
376
382
framer * Framer
377
383
doneServing chan struct {} // closed when serverConn.serve ends
378
384
readFrameCh chan readFrameResult // written by serverConn.readFrames
@@ -436,10 +442,12 @@ func (sc *serverConn) maxHeaderListSize() uint32 {
436
442
// responseWriter's state field.
437
443
type stream struct {
438
444
// immutable:
439
- sc * serverConn
440
- id uint32
441
- body * pipe // non-nil if expecting DATA frames
442
- cw closeWaiter // closed wait stream transitions to closed state
445
+ sc * serverConn
446
+ id uint32
447
+ body * pipe // non-nil if expecting DATA frames
448
+ cw closeWaiter // closed wait stream transitions to closed state
449
+ ctx contextContext
450
+ cancelCtx func ()
443
451
444
452
// owned by serverConn's serve loop:
445
453
bodyBytes int64 // body bytes seen so far
@@ -1157,6 +1165,7 @@ func (sc *serverConn) processResetStream(f *RSTStreamFrame) error {
1157
1165
}
1158
1166
if st != nil {
1159
1167
st .gotReset = true
1168
+ st .cancelCtx ()
1160
1169
sc .closeStream (st , StreamError {f .StreamID , f .ErrCode })
1161
1170
}
1162
1171
return nil
@@ -1380,10 +1389,13 @@ func (sc *serverConn) processHeaders(f *MetaHeadersFrame) error {
1380
1389
}
1381
1390
sc .maxStreamID = id
1382
1391
1392
+ ctx , cancelCtx := contextWithCancel (sc .baseCtx )
1383
1393
st = & stream {
1384
- sc : sc ,
1385
- id : id ,
1386
- state : stateOpen ,
1394
+ sc : sc ,
1395
+ id : id ,
1396
+ state : stateOpen ,
1397
+ ctx : ctx ,
1398
+ cancelCtx : cancelCtx ,
1387
1399
}
1388
1400
if f .StreamEnded () {
1389
1401
st .state = stateHalfClosedRemote
@@ -1617,6 +1629,7 @@ func (sc *serverConn) newWriterAndRequest(st *stream, f *MetaHeadersFrame) (*res
1617
1629
Body : body ,
1618
1630
Trailer : trailer ,
1619
1631
}
1632
+ req = requestWithContext (req , st .ctx )
1620
1633
if bodyOpen {
1621
1634
// Disabled, per golang.org/issue/14960:
1622
1635
// st.reqBuf = sc.getRequestBodyBuf()
@@ -1661,6 +1674,7 @@ func (sc *serverConn) getRequestBodyBuf() []byte {
1661
1674
func (sc * serverConn ) runHandler (rw * responseWriter , req * http.Request , handler func (http.ResponseWriter , * http.Request )) {
1662
1675
didPanic := true
1663
1676
defer func () {
1677
+ rw .rws .stream .cancelCtx ()
1664
1678
if didPanic {
1665
1679
e := recover ()
1666
1680
// Same as net/http:
0 commit comments