@@ -2470,24 +2470,49 @@ def test_remote_shutdown_receives_trailing_data(self):
2470
2470
future = None
2471
2471
2472
2472
def server (sock ):
2473
- sock .starttls (sslctx , server_side = True )
2474
- self .assertEqual (sock .recv_all (4 ), b'ping' )
2475
- sock .send (b'pong' )
2473
+ incoming = ssl .MemoryBIO ()
2474
+ outgoing = ssl .MemoryBIO ()
2475
+ sslobj = sslctx .wrap_bio (incoming , outgoing , server_side = True )
2476
+
2477
+ while True :
2478
+ try :
2479
+ sslobj .do_handshake ()
2480
+ except ssl .SSLWantReadError :
2481
+ if outgoing .pending :
2482
+ sock .send (outgoing .read ())
2483
+ incoming .write (sock .recv (16384 ))
2484
+ else :
2485
+ if outgoing .pending :
2486
+ sock .send (outgoing .read ())
2487
+ break
2488
+
2489
+ incoming .write (sock .recv (16384 ))
2490
+ self .assertEqual (sslobj .read (4 ), b'ping' )
2491
+ sslobj .write (b'pong' )
2492
+ sock .send (outgoing .read ())
2476
2493
2477
2494
time .sleep (0.2 ) # wait for the peer to fill its backlog
2478
2495
2479
2496
# send close_notify but don't wait for response
2480
- sock .setblocking (0 )
2481
2497
with self .assertRaises (ssl .SSLWantReadError ):
2482
- sock .unwrap ()
2483
- sock .setblocking ( 1 )
2498
+ sslobj .unwrap ()
2499
+ sock .send ( outgoing . read () )
2484
2500
2485
2501
# should receive all data
2486
- data = sock .recv_all (CHUNK * SIZE )
2487
- self .assertEqual (len (data ), CHUNK * SIZE )
2502
+ data_len = 0
2503
+ while True :
2504
+ try :
2505
+ chunk = len (sslobj .read (16384 ))
2506
+ data_len += chunk
2507
+ except ssl .SSLWantReadError :
2508
+ incoming .write (sock .recv (16384 ))
2509
+ except ssl .SSLZeroReturnError :
2510
+ break
2488
2511
2489
- # wait for close_notify
2490
- sock .unwrap ()
2512
+ self .assertEqual (data_len , CHUNK * SIZE )
2513
+
2514
+ # verify that close_notify is received
2515
+ sslobj .unwrap ()
2491
2516
2492
2517
sock .close ()
2493
2518
0 commit comments