@@ -2606,35 +2606,6 @@ def server(sock):
2606
2606
self .assertEqual (len (data ), CHUNK * SIZE )
2607
2607
sock .close ()
2608
2608
2609
- def openssl_server (sock ):
2610
- conn = openssl_ssl .Connection (sslctx_openssl , sock )
2611
- conn .set_accept_state ()
2612
-
2613
- while True :
2614
- try :
2615
- data = conn .recv (16384 )
2616
- self .assertEqual (data , b'ping' )
2617
- break
2618
- except openssl_ssl .WantReadError :
2619
- pass
2620
-
2621
- # use renegotiation to queue data in peer _write_backlog
2622
- conn .renegotiate ()
2623
- conn .send (b'pong' )
2624
-
2625
- data_size = 0
2626
- while True :
2627
- try :
2628
- chunk = conn .recv (16384 )
2629
- if not chunk :
2630
- break
2631
- data_size += len (chunk )
2632
- except openssl_ssl .WantReadError :
2633
- pass
2634
- except openssl_ssl .ZeroReturnError :
2635
- break
2636
- self .assertEqual (data_size , CHUNK * SIZE )
2637
-
2638
2609
def run (meth ):
2639
2610
def wrapper (sock ):
2640
2611
try :
@@ -2652,12 +2623,18 @@ async def client(addr):
2652
2623
* addr ,
2653
2624
ssl = client_sslctx ,
2654
2625
server_hostname = '' )
2626
+ sslprotocol = writer .get_extra_info ('uvloop.sslproto' )
2655
2627
writer .write (b'ping' )
2656
2628
data = await reader .readexactly (4 )
2657
2629
self .assertEqual (data , b'pong' )
2630
+
2631
+ sslprotocol .pause_writing ()
2658
2632
for _ in range (SIZE ):
2659
2633
writer .write (b'x' * CHUNK )
2634
+
2660
2635
writer .close ()
2636
+ sslprotocol .resume_writing ()
2637
+
2661
2638
await self .wait_closed (writer )
2662
2639
try :
2663
2640
data = await reader .read ()
@@ -2669,9 +2646,6 @@ async def client(addr):
2669
2646
with self .tcp_server (run (server )) as srv :
2670
2647
self .loop .run_until_complete (client (srv .addr ))
2671
2648
2672
- with self .tcp_server (run (openssl_server )) as srv :
2673
- self .loop .run_until_complete (client (srv .addr ))
2674
-
2675
2649
def test_remote_shutdown_receives_trailing_data (self ):
2676
2650
if self .implementation == 'asyncio' :
2677
2651
raise unittest .SkipTest ()
@@ -2892,20 +2866,26 @@ async def client(addr, ctx):
2892
2866
self .assertIsNone (ctx ())
2893
2867
2894
2868
def test_shutdown_timeout_handler_not_set (self ):
2869
+ if self .implementation == 'asyncio' :
2870
+ # asyncio cannot receive EOF after resume_reading()
2871
+ raise unittest .SkipTest ()
2872
+
2895
2873
loop = self .loop
2874
+ eof = asyncio .Event ()
2875
+ extra = None
2896
2876
2897
2877
def server (sock ):
2898
2878
sslctx = self ._create_server_ssl_context (self .ONLYCERT ,
2899
2879
self .ONLYKEY )
2900
2880
sock = sslctx .wrap_socket (sock , server_side = True )
2901
2881
sock .send (b'hello' )
2902
2882
assert sock .recv (1024 ) == b'world'
2903
- time .sleep (0.1 )
2904
- sock .send (b'extra bytes' * 1 )
2883
+ sock .send (b'extra bytes' )
2905
2884
# sending EOF here
2906
2885
sock .shutdown (socket .SHUT_WR )
2886
+ loop .call_soon_threadsafe (eof .set )
2907
2887
# make sure we have enough time to reproduce the issue
2908
- time . sleep ( 0.1 )
2888
+ assert sock . recv ( 1024 ) == b''
2909
2889
sock .close ()
2910
2890
2911
2891
class Protocol (asyncio .Protocol ):
@@ -2917,20 +2897,28 @@ def connection_made(self, transport):
2917
2897
self .transport = transport
2918
2898
2919
2899
def data_received (self , data ):
2920
- self .transport .write (b'world' )
2921
- # pause reading would make incoming data stay in the sslobj
2922
- self .transport .pause_reading ()
2923
- # resume for AIO to pass
2924
- loop .call_later (0.2 , self .transport .resume_reading )
2900
+ if data == b'hello' :
2901
+ self .transport .write (b'world' )
2902
+ # pause reading would make incoming data stay in the sslobj
2903
+ self .transport .pause_reading ()
2904
+ else :
2905
+ nonlocal extra
2906
+ extra = data
2925
2907
2926
2908
def connection_lost (self , exc ):
2927
- self .fut .set_result (None )
2909
+ if exc is None :
2910
+ self .fut .set_result (None )
2911
+ else :
2912
+ self .fut .set_exception (exc )
2928
2913
2929
2914
async def client (addr ):
2930
2915
ctx = self ._create_client_ssl_context ()
2931
2916
tr , pr = await loop .create_connection (Protocol , * addr , ssl = ctx )
2917
+ await eof .wait ()
2918
+ tr .resume_reading ()
2932
2919
await pr .fut
2933
2920
tr .close ()
2921
+ assert extra == b'extra bytes'
2934
2922
2935
2923
with self .tcp_server (server ) as srv :
2936
2924
loop .run_until_complete (client (srv .addr ))
0 commit comments