@@ -427,12 +427,12 @@ class ConnectionStateMachineTests: XCTestCase {
427
427
428
428
self . setupServerGoaway ( streamsToOpen: [ streamOne, streamThree, streamFive, streamSeven] , lastStreamID: streamThree, expectedToClose: [ streamFive, streamSeven] )
429
429
430
- // Server attempts to send on a closed stream fails, and clients reject that attempt as well .
430
+ // Server attempts to send on a closed stream fails, and clients ignore that attempt.
431
431
// Client attempts to send on a closed stream fails, but the server ignores such frames.
432
432
var temporaryServer = self . server!
433
433
var temporaryClient = self . client!
434
434
assertConnectionError ( type: . streamClosed, temporaryServer. sendWindowUpdate ( streamID: streamFive, windowIncrement: 15 ) )
435
- assertConnectionError ( type : . streamClosed , temporaryClient. receiveWindowUpdate ( streamID: streamFive, windowIncrement: 15 ) )
435
+ assertIgnored ( temporaryClient. receiveWindowUpdate ( streamID: streamFive, windowIncrement: 15 ) )
436
436
437
437
temporaryServer = self . server!
438
438
temporaryClient = self . client!
@@ -551,7 +551,7 @@ class ConnectionStateMachineTests: XCTestCase {
551
551
self . setupClientGoaway ( clientStreamID: streamOne, streamsToOpen: [ streamTwo, streamFour, streamSix] , lastStreamID: streamTwo, expectedToClose: [ streamFour, streamSix] )
552
552
553
553
// Server attempts to send on a closed stream fails, but clients ignore that attempt.
554
- // Client attempts to send on a closed stream fails, and the server rejects such frames .
554
+ // Client attempts to send on a closed stream fails, but the server ignores that attempt .
555
555
var temporaryServer = self . server!
556
556
var temporaryClient = self . client!
557
557
assertConnectionError ( type: . streamClosed, temporaryServer. sendWindowUpdate ( streamID: streamFour, windowIncrement: 15 ) )
@@ -560,7 +560,7 @@ class ConnectionStateMachineTests: XCTestCase {
560
560
temporaryServer = self . server!
561
561
temporaryClient = self . client!
562
562
assertConnectionError ( type: . streamClosed, temporaryClient. sendWindowUpdate ( streamID: streamFour, windowIncrement: 15 ) )
563
- assertConnectionError ( type : . streamClosed , temporaryServer. receiveWindowUpdate ( streamID: streamFour, windowIncrement: 15 ) )
563
+ assertIgnored ( temporaryServer. receiveWindowUpdate ( streamID: streamFour, windowIncrement: 15 ) )
564
564
}
565
565
566
566
func testRstStreamOnClosedStreamAfterClientGoaway( ) {
@@ -1315,6 +1315,36 @@ class ConnectionStateMachineTests: XCTestCase {
1315
1315
assertStreamError ( type: . protocolError, tempClient. receiveWindowUpdate ( streamID: streamTwo, windowIncrement: 15 ) )
1316
1316
}
1317
1317
1318
+ func testWindowUpdateOnClosedStream( ) {
1319
+ let streamOne = HTTP2StreamID ( 1 )
1320
+
1321
+ self . exchangePreamble ( )
1322
+
1323
+ // Client sends a request.
1324
+ assertSucceeds ( self . client. sendHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: false ) )
1325
+ assertSucceeds ( self . server. receiveHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . requestHeaders, isEndStreamSet: false ) )
1326
+
1327
+ // Server sends a response.
1328
+ assertSucceeds ( self . server. sendHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . responseHeaders, isEndStreamSet: false ) )
1329
+ assertSucceeds ( self . client. receiveHeaders ( streamID: streamOne, headers: ConnectionStateMachineTests . responseHeaders, isEndStreamSet: false ) )
1330
+
1331
+ // Client sends end stream, server receives end stream.
1332
+ assertSucceeds ( self . client. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
1333
+ assertSucceeds ( self . server. receiveData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
1334
+
1335
+ // Client is now half closed (local), server is half closed (remote)
1336
+
1337
+ // Server sends end stream and is now closed.
1338
+ assertSucceeds ( self . server. sendData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
1339
+
1340
+ // Client is half closed and sends window update, the server MUST ignore this.
1341
+ assertSucceeds ( self . client. sendWindowUpdate ( streamID: streamOne, windowIncrement: 10 ) )
1342
+ assertIgnored ( self . server. receiveWindowUpdate ( streamID: streamOne, windowIncrement: 10 ) )
1343
+
1344
+ // Client receives end stream and closes.
1345
+ assertSucceeds ( self . client. receiveData ( streamID: streamOne, contentLength: 0 , flowControlledBytes: 0 , isEndStreamSet: true ) )
1346
+ }
1347
+
1318
1348
func testWindowIncrementsOfSizeZeroArentOk( ) {
1319
1349
let streamOne = HTTP2StreamID ( 1 )
1320
1350
0 commit comments