@@ -809,9 +809,6 @@ func TestServer_Request_Post_Body_ContentLength_TooSmall(t *testing.T) {
809
809
EndHeaders : true ,
810
810
})
811
811
st .writeData (1 , true , []byte ("12345" ))
812
- // Return flow control bytes back, since the data handler closed
813
- // the stream.
814
- st .wantWindowUpdate (0 , 5 )
815
812
})
816
813
}
817
814
@@ -1247,6 +1244,41 @@ func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
1247
1244
1248
1245
st .greet ()
1249
1246
1247
+ st .writeHeaders (HeadersFrameParam {
1248
+ StreamID : 1 , // clients send odd numbers
1249
+ BlockFragment : st .encodeHeader (":method" , "POST" ),
1250
+ EndStream : false , // data coming
1251
+ EndHeaders : true ,
1252
+ })
1253
+ updateSize := 1 << 20 / 2 // the conn & stream size before a WindowUpdate
1254
+ st .writeData (1 , false , bytes .Repeat ([]byte ("a" ), updateSize - 10 ))
1255
+ st .writeData (1 , false , bytes .Repeat ([]byte ("b" ), 10 ))
1256
+ puppet .do (readBodyHandler (t , strings .Repeat ("a" , updateSize - 10 )))
1257
+ puppet .do (readBodyHandler (t , strings .Repeat ("b" , 10 )))
1258
+
1259
+ st .wantWindowUpdate (0 , uint32 (updateSize ))
1260
+ st .wantWindowUpdate (1 , uint32 (updateSize ))
1261
+
1262
+ st .writeData (1 , false , bytes .Repeat ([]byte ("a" ), updateSize - 10 ))
1263
+ st .writeData (1 , true , bytes .Repeat ([]byte ("c" ), 15 )) // END_STREAM here
1264
+ puppet .do (readBodyHandler (t , strings .Repeat ("a" , updateSize - 10 )))
1265
+ puppet .do (readBodyHandler (t , strings .Repeat ("c" , 15 )))
1266
+
1267
+ st .wantWindowUpdate (0 , uint32 (updateSize + 5 ))
1268
+ }
1269
+
1270
+ func TestServer_Handler_Sends_WindowUpdate_SmallStream (t * testing.T ) {
1271
+ puppet := newHandlerPuppet ()
1272
+ st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
1273
+ puppet .act (w , r )
1274
+ }, func (s * Server ) {
1275
+ s .MaxUploadBufferPerStream = 6
1276
+ })
1277
+ defer st .Close ()
1278
+ defer puppet .done ()
1279
+
1280
+ st .greet ()
1281
+
1250
1282
st .writeHeaders (HeadersFrameParam {
1251
1283
StreamID : 1 , // clients send odd numbers
1252
1284
BlockFragment : st .encodeHeader (":method" , "POST" ),
@@ -1255,18 +1287,14 @@ func TestServer_Handler_Sends_WindowUpdate(t *testing.T) {
1255
1287
})
1256
1288
st .writeData (1 , false , []byte ("abcdef" ))
1257
1289
puppet .do (readBodyHandler (t , "abc" ))
1258
- st . wantWindowUpdate ( 0 , 3 )
1259
- st . wantWindowUpdate ( 1 , 3 )
1290
+ puppet . do ( readBodyHandler ( t , "d" ) )
1291
+ puppet . do ( readBodyHandler ( t , "ef" ) )
1260
1292
1261
- puppet .do (readBodyHandler (t , "def" ))
1262
- st .wantWindowUpdate (0 , 3 )
1263
- st .wantWindowUpdate (1 , 3 )
1293
+ st .wantWindowUpdate (1 , 6 )
1264
1294
1265
1295
st .writeData (1 , true , []byte ("ghijkl" )) // END_STREAM here
1266
1296
puppet .do (readBodyHandler (t , "ghi" ))
1267
1297
puppet .do (readBodyHandler (t , "jkl" ))
1268
- st .wantWindowUpdate (0 , 3 )
1269
- st .wantWindowUpdate (0 , 3 ) // no more stream-level, since END_STREAM
1270
1298
}
1271
1299
1272
1300
// the version of the TestServer_Handler_Sends_WindowUpdate with padding.
@@ -1295,12 +1323,7 @@ func TestServer_Handler_Sends_WindowUpdate_Padding(t *testing.T) {
1295
1323
st .wantWindowUpdate (1 , 5 )
1296
1324
1297
1325
puppet .do (readBodyHandler (t , "abc" ))
1298
- st .wantWindowUpdate (0 , 3 )
1299
- st .wantWindowUpdate (1 , 3 )
1300
-
1301
1326
puppet .do (readBodyHandler (t , "def" ))
1302
- st .wantWindowUpdate (0 , 3 )
1303
- st .wantWindowUpdate (1 , 3 )
1304
1327
}
1305
1328
1306
1329
func TestServer_Send_GoAway_After_Bogus_WindowUpdate (t * testing.T ) {
@@ -2296,8 +2319,6 @@ func TestServer_Response_Automatic100Continue(t *testing.T) {
2296
2319
// gigantic and/or sensitive "foo" payload now.
2297
2320
st .writeData (1 , true , []byte (msg ))
2298
2321
2299
- st .wantWindowUpdate (0 , uint32 (len (msg )))
2300
-
2301
2322
hf = st .wantHeaders ()
2302
2323
if hf .StreamEnded () {
2303
2324
t .Fatal ("expected data to follow" )
@@ -2485,9 +2506,6 @@ func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) {
2485
2506
// it did before.
2486
2507
st .writeData (1 , true , []byte ("foo" ))
2487
2508
2488
- // Get our flow control bytes back, since the handler didn't get them.
2489
- st .wantWindowUpdate (0 , uint32 (len ("foo" )))
2490
-
2491
2509
// Sent after a peer sends data anyway (admittedly the
2492
2510
// previous RST_STREAM might've still been in-flight),
2493
2511
// but they'll get the more friendly 'cancel' code
@@ -3930,7 +3948,6 @@ func TestServer_Rejects_TooSmall(t *testing.T) {
3930
3948
EndHeaders : true ,
3931
3949
})
3932
3950
st .writeData (1 , true , []byte ("12345" ))
3933
- st .wantWindowUpdate (0 , 5 )
3934
3951
st .wantRSTStream (1 , ErrCodeProtocol )
3935
3952
})
3936
3953
}
@@ -4223,7 +4240,6 @@ func TestServerWindowUpdateOnBodyClose(t *testing.T) {
4223
4240
st .writeData (1 , false , []byte (content [5 :]))
4224
4241
blockCh <- true
4225
4242
4226
- increments := len (content )
4227
4243
for {
4228
4244
f , err := st .readFrame ()
4229
4245
if err == io .EOF {
@@ -4232,10 +4248,12 @@ func TestServerWindowUpdateOnBodyClose(t *testing.T) {
4232
4248
if err != nil {
4233
4249
t .Fatal (err )
4234
4250
}
4251
+ if rs , ok := f .(* RSTStreamFrame ); ok && rs .StreamID == 1 {
4252
+ break
4253
+ }
4235
4254
if wu , ok := f .(* WindowUpdateFrame ); ok && wu .StreamID == 0 {
4236
- increments -= int (wu .Increment )
4237
- if increments == 0 {
4238
- break
4255
+ if e , a := uint32 (3 ), wu .Increment ; e != a {
4256
+ t .Errorf ("Increment=%d, want %d" , a , e )
4239
4257
}
4240
4258
}
4241
4259
}
@@ -4378,22 +4396,22 @@ func TestServerSendsEarlyHints(t *testing.T) {
4378
4396
4379
4397
func TestProtocolErrorAfterGoAway (t * testing.T ) {
4380
4398
st := newServerTester (t , func (w http.ResponseWriter , r * http.Request ) {
4399
+ w .WriteHeader (200 )
4400
+ w .(http.Flusher ).Flush ()
4381
4401
io .Copy (io .Discard , r .Body )
4382
4402
})
4383
4403
defer st .Close ()
4384
4404
4385
4405
st .greet ()
4386
- content := "some content"
4387
4406
st .writeHeaders (HeadersFrameParam {
4388
4407
StreamID : 1 ,
4389
4408
BlockFragment : st .encodeHeader (
4390
4409
":method" , "POST" ,
4391
- "content-length" , strconv . Itoa ( len ( content )) ,
4410
+ "content-length" , "1" ,
4392
4411
),
4393
4412
EndStream : false ,
4394
4413
EndHeaders : true ,
4395
4414
})
4396
- st .writeData (1 , false , []byte (content [:5 ]))
4397
4415
4398
4416
_ , err := st .readFrame ()
4399
4417
if err != nil {
0 commit comments