28
28
async def echo_server (nursery ):
29
29
''' A server that reads one message, sends back the same message,
30
30
then closes the connection. '''
31
- serve_fn = partial (serve_websocket , echo_handler , HOST , 0 , ssl_context = None )
31
+ serve_fn = partial (serve_websocket , echo_request_handler , HOST , 0 ,
32
+ ssl_context = None )
32
33
server = await nursery .start (serve_fn )
33
34
await yield_ (server )
34
35
@@ -38,12 +39,20 @@ async def echo_server(nursery):
38
39
async def echo_conn (echo_server ):
39
40
''' Return a client connection instance that is connected to an echo
40
41
server. '''
41
- async with open_websocket (HOST , echo_server .port , RESOURCE , use_ssl = False ) \
42
- as conn :
42
+ async with open_websocket (HOST , echo_server .port , RESOURCE ,
43
+ use_ssl = False ) as conn :
43
44
await yield_ (conn )
44
45
45
46
46
- async def echo_handler (conn ):
47
+ async def echo_request_handler (request ):
48
+ '''
49
+ Accept incoming request and then pass off to echo connection handler.
50
+ '''
51
+ conn = await request .accept ()
52
+ await echo_conn_handler (conn )
53
+
54
+
55
+ async def echo_conn_handler (conn ):
47
56
''' A connection handler that reads one message, sends back the same
48
57
message, then exits. '''
49
58
try :
@@ -95,14 +104,16 @@ async def test_listen_port_ipv6():
95
104
96
105
97
106
async def test_server_has_listeners (nursery ):
98
- server = await nursery .start (serve_websocket , echo_handler , HOST , 0 , None )
107
+ server = await nursery .start (serve_websocket , echo_request_handler , HOST , 0 ,
108
+ None )
99
109
assert len (server .listeners ) > 0
100
110
assert isinstance (server .listeners [0 ], ListenPort )
101
111
102
112
103
113
async def test_serve (nursery ):
104
114
task = trio .hazmat .current_task ()
105
- server = await nursery .start (serve_websocket , echo_handler , HOST , 0 , None )
115
+ server = await nursery .start (serve_websocket , echo_request_handler , HOST , 0 ,
116
+ None )
106
117
port = server .port
107
118
assert server .port != 0
108
119
# The server nursery begins with one task (server.listen).
@@ -123,17 +134,19 @@ async def test_serve_ssl(nursery):
123
134
ca .configure_trust (client_context )
124
135
cert = ca .issue_server_cert (HOST )
125
136
cert .configure_cert (server_context )
126
- server = await nursery .start (serve_websocket , echo_handler , HOST , 0 ,
137
+
138
+ server = await nursery .start (serve_websocket , echo_request_handler , HOST , 0 ,
127
139
server_context )
128
140
port = server .port
129
- async with open_websocket (HOST , port , RESOURCE , client_context ) as conn :
141
+ async with open_websocket (HOST , port , RESOURCE , use_ssl = client_context
142
+ ) as conn :
130
143
assert not conn .is_closed
131
144
132
145
133
146
async def test_serve_handler_nursery (nursery ):
134
147
task = trio .hazmat .current_task ()
135
148
async with trio .open_nursery () as handler_nursery :
136
- serve_with_nursery = partial (serve_websocket , echo_handler ,
149
+ serve_with_nursery = partial (serve_websocket , echo_request_handler ,
137
150
HOST , 0 , None , handler_nursery = handler_nursery )
138
151
server = await nursery .start (serve_with_nursery )
139
152
port = server .port
@@ -149,12 +162,12 @@ async def test_serve_handler_nursery(nursery):
149
162
async def test_serve_with_zero_listeners (nursery ):
150
163
task = trio .hazmat .current_task ()
151
164
with pytest .raises (ValueError ):
152
- server = WebSocketServer (echo_handler , [])
165
+ server = WebSocketServer (echo_request_handler , [])
153
166
154
167
155
168
async def test_serve_non_tcp_listener (nursery ):
156
169
listeners = [MemoryListener ()]
157
- server = WebSocketServer (echo_handler , listeners )
170
+ server = WebSocketServer (echo_request_handler , listeners )
158
171
await nursery .start (server .run )
159
172
assert len (server .listeners ) == 1
160
173
with pytest .raises (RuntimeError ):
@@ -165,7 +178,7 @@ async def test_serve_non_tcp_listener(nursery):
165
178
async def test_serve_multiple_listeners (nursery ):
166
179
listener1 = (await trio .open_tcp_listeners (0 , host = HOST ))[0 ]
167
180
listener2 = MemoryListener ()
168
- server = WebSocketServer (echo_handler , [listener1 , listener2 ])
181
+ server = WebSocketServer (echo_request_handler , [listener1 , listener2 ])
169
182
await nursery .start (server .run )
170
183
assert len (server .listeners ) == 2
171
184
with pytest .raises (RuntimeError ):
@@ -213,6 +226,21 @@ async def test_client_connect_url(echo_server, nursery):
213
226
assert not conn .is_closed
214
227
215
228
229
+ async def test_handshake_subprotocol (nursery ):
230
+ async def handler (request ):
231
+ assert request .proposed_subprotocols == ('chat' , 'file' )
232
+ assert request .subprotocol is None
233
+ request .subprotocol = 'chat'
234
+ assert request .subprotocol == 'chat'
235
+ server_ws = await request .accept ()
236
+ assert server_ws .subprotocol == 'chat'
237
+
238
+ server = await nursery .start (serve_websocket , handler , HOST , 0 , None )
239
+ async with open_websocket (HOST , server .port , RESOURCE , use_ssl = False ,
240
+ subprotocols = ('chat' , 'file' )) as client_ws :
241
+ assert client_ws .subprotocol == 'chat'
242
+
243
+
216
244
async def test_client_send_and_receive (echo_conn ):
217
245
async with echo_conn :
218
246
await echo_conn .send_message ('This is a test message.' )
@@ -293,12 +321,13 @@ async def test_wrap_client_stream(echo_server, nursery):
293
321
294
322
async def test_wrap_server_stream (nursery ):
295
323
async def handler (stream ):
296
- server = await wrap_server_stream (nursery , stream )
297
- async with server :
298
- assert not server .is_closed
299
- msg = await server .get_message ()
324
+ request = await wrap_server_stream (nursery , stream )
325
+ server_ws = await request .accept ()
326
+ async with server_ws :
327
+ assert not server_ws .is_closed
328
+ msg = await server_ws .get_message ()
300
329
assert msg == 'Hello from client!'
301
- assert server .is_closed
330
+ assert server_ws .is_closed
302
331
serve_fn = partial (trio .serve_tcp , handler , 0 , host = HOST )
303
332
listeners = await nursery .start (serve_fn )
304
333
port = listeners [0 ].socket .getsockname ()[1 ]
@@ -307,26 +336,28 @@ async def handler(stream):
307
336
308
337
309
338
async def test_client_does_not_close_handshake (nursery ):
310
- async def handler (server ):
339
+ async def handler (request ):
340
+ server_ws = await request .accept ()
311
341
with pytest .raises (ConnectionClosed ):
312
- await server .get_message ()
342
+ await server_ws .get_message ()
313
343
server = await nursery .start (serve_websocket , handler , HOST , 0 , None )
314
344
port = server .port
315
345
stream = await trio .open_tcp_stream (HOST , server .port )
316
- client = await wrap_client_stream (nursery , stream , HOST , RESOURCE )
317
- async with client :
346
+ client_ws = await wrap_client_stream (nursery , stream , HOST , RESOURCE )
347
+ async with client_ws :
318
348
await stream .aclose ()
319
349
with pytest .raises (ConnectionClosed ):
320
- await client .send_message ('Hello from client!' )
350
+ await client_ws .send_message ('Hello from client!' )
321
351
322
352
323
353
async def test_server_does_not_close_handshake (nursery ):
324
354
async def handler (stream ):
325
- server = await wrap_server_stream (nursery , stream )
326
- async with server :
355
+ request = await wrap_server_stream (nursery , stream )
356
+ server_ws = await request .accept ()
357
+ async with server_ws :
327
358
await stream .aclose ()
328
359
with pytest .raises (ConnectionClosed ):
329
- await server .send_message ('Hello from client!' )
360
+ await server_ws .send_message ('Hello from client!' )
330
361
serve_fn = partial (trio .serve_tcp , handler , 0 , host = HOST )
331
362
listeners = await nursery .start (serve_fn )
332
363
port = listeners [0 ].socket .getsockname ()[1 ]
@@ -336,7 +367,8 @@ async def handler(stream):
336
367
337
368
338
369
async def test_server_handler_exit (nursery , autojump_clock ):
339
- async def handler (connection ):
370
+ async def handler (request ):
371
+ server_ws = await request .accept ()
340
372
await trio .sleep (1 )
341
373
342
374
server = await nursery .start (
0 commit comments