File tree 2 files changed +46
-0
lines changed
2 files changed +46
-0
lines changed Original file line number Diff line number Diff line change @@ -1371,6 +1371,9 @@ func (sc *serverConn) startGracefulShutdownInternal() {
1371
1371
func (sc * serverConn ) goAway (code ErrCode ) {
1372
1372
sc .serveG .check ()
1373
1373
if sc .inGoAway {
1374
+ if sc .goAwayCode == ErrCodeNo {
1375
+ sc .goAwayCode = code
1376
+ }
1374
1377
return
1375
1378
}
1376
1379
sc .inGoAway = true
Original file line number Diff line number Diff line change @@ -4366,3 +4366,46 @@ func TestServerSendsEarlyHints(t *testing.T) {
4366
4366
}
4367
4367
})
4368
4368
}
4369
+
4370
+ func TestProtocolErrorAfterGoAway (t * testing.T ) {
4371
+ st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
4372
+ io .Copy (io .Discard , r .Body )
4373
+ })
4374
+ defer st .Close ()
4375
+
4376
+ st .greet ()
4377
+ content := "some content"
4378
+ st .writeHeaders (HeadersFrameParam {
4379
+ StreamID : 1 ,
4380
+ BlockFragment : st .encodeHeader (
4381
+ ":method" , "POST" ,
4382
+ "content-length" , strconv .Itoa (len (content )),
4383
+ ),
4384
+ EndStream : false ,
4385
+ EndHeaders : true ,
4386
+ })
4387
+ st .writeData (1 , false , []byte (content [:5 ]))
4388
+
4389
+ _ , err := st .readFrame ()
4390
+ if err != nil {
4391
+ st .t .Fatal (err )
4392
+ }
4393
+
4394
+ // Send a GOAWAY with ErrCodeNo, followed by a bogus window update.
4395
+ // The server should close the connection.
4396
+ if err := st .fr .WriteGoAway (1 , ErrCodeNo , nil ); err != nil {
4397
+ t .Fatal (err )
4398
+ }
4399
+ if err := st .fr .WriteWindowUpdate (0 , 1 << 31 - 1 ); err != nil {
4400
+ t .Fatal (err )
4401
+ }
4402
+
4403
+ for {
4404
+ if _ , err := st .readFrame (); err != nil {
4405
+ if err != io .EOF {
4406
+ t .Errorf ("unexpected readFrame error: %v" , err )
4407
+ }
4408
+ break
4409
+ }
4410
+ }
4411
+ }
You can’t perform that action at this time.
0 commit comments