File tree 2 files changed +37
-0
lines changed
2 files changed +37
-0
lines changed Original file line number Diff line number Diff line change @@ -1661,6 +1661,7 @@ func (sc *serverConn) closeStream(st *stream, err error) {
1661
1661
}
1662
1662
}
1663
1663
st .closeErr = err
1664
+ st .cancelCtx ()
1664
1665
st .cw .Close () // signals Handler's CloseNotifier, unblocks writes, etc
1665
1666
sc .writeSched .CloseStream (st .id )
1666
1667
}
Original file line number Diff line number Diff line change @@ -4900,3 +4900,39 @@ func TestServerUpgradeRequestPrefaceFailure(t *testing.T) {
4900
4900
c2 .Close ()
4901
4901
<- donec
4902
4902
}
4903
+
4904
+ // Issue 67036: A stream error should result in the handler's request context being canceled.
4905
+ func TestServerRequestCancelOnError (t * testing.T ) {
4906
+ recvc := make (chan struct {}) // handler has started
4907
+ donec := make (chan struct {}) // handler has finished
4908
+ st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
4909
+ close (recvc )
4910
+ <- r .Context ().Done ()
4911
+ close (donec )
4912
+ })
4913
+ defer st .Close ()
4914
+
4915
+ st .writePreface ()
4916
+ st .writeInitialSettings ()
4917
+ st .writeSettingsAck ()
4918
+
4919
+ // Client sends request headers, handler starts.
4920
+ st .writeHeaders (HeadersFrameParam {
4921
+ StreamID : 1 ,
4922
+ BlockFragment : st .encodeHeader (),
4923
+ EndStream : true ,
4924
+ EndHeaders : true ,
4925
+ })
4926
+ <- recvc
4927
+
4928
+ // Client sends an invalid second set of request headers.
4929
+ // The stream is reset.
4930
+ // The handler's context is canceled, and the handler exits.
4931
+ st .writeHeaders (HeadersFrameParam {
4932
+ StreamID : 1 ,
4933
+ BlockFragment : st .encodeHeader (),
4934
+ EndStream : true ,
4935
+ EndHeaders : true ,
4936
+ })
4937
+ <- donec
4938
+ }
You can’t perform that action at this time.
0 commit comments