@@ -503,9 +503,13 @@ public async Task WebSocket_Abort_Interrupts_Pending_ReceiveAsync()
503
503
{
504
504
WebSocket serverSocket = null ;
505
505
506
+ // Events that we want to sequence execution across client and server.
506
507
var socketWasAccepted = new ManualResetEventSlim ( ) ;
507
508
var socketWasAborted = new ManualResetEventSlim ( ) ;
508
509
var firstReceiveOccured = new ManualResetEventSlim ( ) ;
510
+ var secondReceiveInitiated = new ManualResetEventSlim ( ) ;
511
+
512
+ Exception receiveException = null ;
509
513
510
514
await using ( var server = KestrelWebSocketHelpers . CreateServer ( LoggerFactory , out var port , async context =>
511
515
{
@@ -515,24 +519,36 @@ public async Task WebSocket_Abort_Interrupts_Pending_ReceiveAsync()
515
519
516
520
var serverBuffer = new byte [ 1024 ] ;
517
521
518
- var finishedWithConnectionAborted = false ;
519
-
520
522
try
521
523
{
522
524
while ( serverSocket . State is WebSocketState . Open or WebSocketState . CloseSent )
523
525
{
524
- var response = await serverSocket . ReceiveAsync ( serverBuffer , default ) ;
525
- firstReceiveOccured . Set ( ) ;
526
+ if ( firstReceiveOccured . IsSet )
527
+ {
528
+ var pendingResponse = serverSocket . ReceiveAsync ( serverBuffer , default ) ;
529
+ secondReceiveInitiated . Set ( ) ;
530
+ var response = await pendingResponse ;
531
+ }
532
+ else
533
+ {
534
+ var response = await serverSocket . ReceiveAsync ( serverBuffer , default ) ;
535
+ firstReceiveOccured . Set ( ) ;
536
+ }
526
537
}
527
538
}
528
- catch ( ConnectionAbortedException )
539
+ catch ( ConnectionAbortedException ex )
529
540
{
530
541
socketWasAborted . Set ( ) ;
531
- finishedWithConnectionAborted = true ;
542
+ receiveException = ex ;
543
+ }
544
+ catch ( Exception ex )
545
+ {
546
+ // Capture this exception so a test failure can give us more information.
547
+ receiveException = ex ;
532
548
}
533
549
finally
534
550
{
535
- Assert . True ( finishedWithConnectionAborted ) ;
551
+ Assert . IsType < ConnectionAbortedException > ( receiveException ) ;
536
552
}
537
553
} ) )
538
554
{
@@ -550,6 +566,9 @@ public async Task WebSocket_Abort_Interrupts_Pending_ReceiveAsync()
550
566
var firstReceiveOccuredDidNotTimeout = firstReceiveOccured . Wait ( 10000 ) ;
551
567
Assert . True ( firstReceiveOccuredDidNotTimeout , "First receive did not occur within the allotted time." ) ;
552
568
569
+ var secondReceiveInitiatedDidNotTimeout = secondReceiveInitiated . Wait ( 10000 ) ;
570
+ Assert . True ( secondReceiveInitiatedDidNotTimeout , "Second receive was not initiated within the allotted time." ) ;
571
+
553
572
serverSocket . Abort ( ) ;
554
573
555
574
var socketWasAbortedDidNotTimeout = socketWasAborted . Wait ( 1000 ) ; // Give it a second to process the abort.
0 commit comments