@@ -1594,6 +1594,68 @@ await ExpectAsync(Http2FrameType.DATA,
1594
1594
await WaitForAllStreamsAsync ( ) ;
1595
1595
}
1596
1596
1597
+ [ Fact ]
1598
+ public async Task OutputFlowControl_ConnectionAndRequestAborted_NoException ( )
1599
+ {
1600
+ // Ensure the stream window size is bigger than the connection window size
1601
+ _clientSettings . InitialWindowSize = _clientSettings . InitialWindowSize * 2 ;
1602
+
1603
+ var connectionAbortedTcs = new TaskCompletionSource ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
1604
+ var requestAbortedTcs = new TaskCompletionSource ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
1605
+
1606
+ await InitializeConnectionAsync ( async context =>
1607
+ {
1608
+ // Exceed connection window size
1609
+ await context . Response . WriteAsync ( new string ( '!' , 65536 ) ) ;
1610
+
1611
+ await connectionAbortedTcs . Task ;
1612
+
1613
+ try
1614
+ {
1615
+ context . Abort ( ) ;
1616
+ requestAbortedTcs . SetResult ( ) ;
1617
+ }
1618
+ catch ( Exception ex )
1619
+ {
1620
+ requestAbortedTcs . SetException ( ex ) ;
1621
+ }
1622
+ } ) . DefaultTimeout ( ) ;
1623
+
1624
+ await StartStreamAsync ( 1 , _browserRequestHeaders , endStream : true ) . DefaultTimeout ( ) ;
1625
+
1626
+ await ExpectAsync ( Http2FrameType . HEADERS ,
1627
+ withLength : 32 ,
1628
+ withFlags : ( byte ) ( Http2HeadersFrameFlags . END_HEADERS ) ,
1629
+ withStreamId : 1 ) . DefaultTimeout ( ) ;
1630
+
1631
+ await ExpectAsync ( Http2FrameType . DATA ,
1632
+ withLength : 16384 ,
1633
+ withFlags : ( byte ) ( Http2DataFrameFlags . NONE ) ,
1634
+ withStreamId : 1 ) . DefaultTimeout ( ) ;
1635
+
1636
+ await ExpectAsync ( Http2FrameType . DATA ,
1637
+ withLength : 16384 ,
1638
+ withFlags : ( byte ) ( Http2DataFrameFlags . NONE ) ,
1639
+ withStreamId : 1 ) . DefaultTimeout ( ) ;
1640
+
1641
+ await ExpectAsync ( Http2FrameType . DATA ,
1642
+ withLength : 16384 ,
1643
+ withFlags : ( byte ) ( Http2DataFrameFlags . NONE ) ,
1644
+ withStreamId : 1 ) . DefaultTimeout ( ) ;
1645
+
1646
+ await ExpectAsync ( Http2FrameType . DATA ,
1647
+ withLength : 16383 ,
1648
+ withFlags : ( byte ) ( Http2DataFrameFlags . NONE ) ,
1649
+ withStreamId : 1 ) . DefaultTimeout ( ) ;
1650
+
1651
+ _connection . HandleReadDataRateTimeout ( ) ;
1652
+
1653
+ connectionAbortedTcs . SetResult ( ) ;
1654
+
1655
+ // Task completing successfully means HttpContext.Abort didn't throw
1656
+ await requestAbortedTcs . Task . DefaultTimeout ( ) ;
1657
+ }
1658
+
1597
1659
[ Fact ]
1598
1660
public async Task DATA_Sent_DespiteStreamOutputFlowControl_IfEmptyAndEndsStream ( )
1599
1661
{
0 commit comments