12
12
from typing import Iterator
13
13
14
14
import trio
15
- from quart import make_response , request
16
-
17
- # TODO switch to Response if https://github.com/pallets/quart/issues/288 is fixed
18
- from quart .typing import ResponseTypes
15
+ from quart import Response , make_response , request
16
+ from quart .typing import ResponseReturnValue
19
17
from quart_trio import QuartTrio
20
18
21
19
hypercorn_app = QuartTrio (__name__ )
39
37
@hypercorn_app .route ("/" )
40
38
@pyodide_testing_app .route ("/" )
41
39
@pyodide_testing_app .route ("/index" )
42
- async def index () -> ResponseTypes :
40
+ async def index () -> ResponseReturnValue :
43
41
return await make_response ("Dummy server!" )
44
42
45
43
46
44
@hypercorn_app .route ("/alpn_protocol" )
47
- async def alpn_protocol () -> ResponseTypes :
45
+ async def alpn_protocol () -> ResponseReturnValue :
48
46
"""Return the requester's certificate."""
49
47
alpn_protocol = request .scope ["extensions" ]["tls" ]["alpn_protocol" ]
50
48
return await make_response (alpn_protocol )
51
49
52
50
53
51
@hypercorn_app .route ("/certificate" )
54
- async def certificate () -> ResponseTypes :
52
+ async def certificate () -> ResponseReturnValue :
55
53
"""Return the requester's certificate."""
56
54
print ("scope" , request .scope )
57
55
subject = request .scope ["extensions" ]["tls" ]["client_cert_name" ]
@@ -61,7 +59,7 @@ async def certificate() -> ResponseTypes:
61
59
62
60
@hypercorn_app .route ("/specific_method" , methods = ["GET" , "POST" , "PUT" ])
63
61
@pyodide_testing_app .route ("/specific_method" , methods = ["GET" , "POST" , "PUT" ])
64
- async def specific_method () -> ResponseTypes :
62
+ async def specific_method () -> ResponseReturnValue :
65
63
"Confirm that the request matches the desired method type"
66
64
method_param = (await request .values ).get ("method" , "" )
67
65
@@ -74,7 +72,7 @@ async def specific_method() -> ResponseTypes:
74
72
75
73
76
74
@hypercorn_app .route ("/upload" , methods = ["POST" ])
77
- async def upload () -> ResponseTypes :
75
+ async def upload () -> ResponseReturnValue :
78
76
"Confirm that the uploaded file conforms to specification"
79
77
params = await request .form
80
78
param = params .get ("upload_param" )
@@ -105,7 +103,7 @@ async def upload() -> ResponseTypes:
105
103
106
104
107
105
@hypercorn_app .route ("/chunked" )
108
- async def chunked () -> ResponseTypes :
106
+ async def chunked () -> ResponseReturnValue :
109
107
def generate () -> Iterator [str ]:
110
108
for _ in range (4 ):
111
109
yield "123"
@@ -114,7 +112,7 @@ def generate() -> Iterator[str]:
114
112
115
113
116
114
@hypercorn_app .route ("/chunked_gzip" )
117
- async def chunked_gzip () -> ResponseTypes :
115
+ async def chunked_gzip () -> ResponseReturnValue :
118
116
def generate () -> Iterator [bytes ]:
119
117
compressor = zlib .compressobj (6 , zlib .DEFLATED , 16 + zlib .MAX_WBITS )
120
118
@@ -126,7 +124,7 @@ def generate() -> Iterator[bytes]:
126
124
127
125
128
126
@hypercorn_app .route ("/keepalive" )
129
- async def keepalive () -> ResponseTypes :
127
+ async def keepalive () -> ResponseReturnValue :
130
128
if request .args .get ("close" , b"0" ) == b"1" :
131
129
headers = [("Connection" , "close" )]
132
130
return await make_response ("Closing" , 200 , headers )
@@ -136,7 +134,7 @@ async def keepalive() -> ResponseTypes:
136
134
137
135
138
136
@hypercorn_app .route ("/echo" , methods = ["GET" , "POST" , "PUT" ])
139
- async def echo () -> ResponseTypes :
137
+ async def echo () -> ResponseReturnValue :
140
138
"Echo back the params"
141
139
if request .method == "GET" :
142
140
return await make_response (request .query_string )
@@ -146,7 +144,7 @@ async def echo() -> ResponseTypes:
146
144
147
145
@hypercorn_app .route ("/echo_json" , methods = ["POST" ])
148
146
@pyodide_testing_app .route ("/echo_json" , methods = ["POST" , "OPTIONS" ])
149
- async def echo_json () -> ResponseTypes :
147
+ async def echo_json () -> ResponseReturnValue :
150
148
"Echo back the JSON"
151
149
if request .method == "OPTIONS" :
152
150
return await make_response ("" , 200 )
@@ -156,27 +154,27 @@ async def echo_json() -> ResponseTypes:
156
154
157
155
@hypercorn_app .route ("/echo_uri/<path:rest>" )
158
156
@hypercorn_app .route ("/echo_uri" , defaults = {"rest" : "" })
159
- async def echo_uri (rest : str ) -> ResponseTypes :
157
+ async def echo_uri (rest : str ) -> ResponseReturnValue :
160
158
"Echo back the requested URI"
161
159
assert request .full_path is not None
162
160
return await make_response (request .full_path )
163
161
164
162
165
163
@hypercorn_app .route ("/echo_params" )
166
- async def echo_params () -> ResponseTypes :
164
+ async def echo_params () -> ResponseReturnValue :
167
165
"Echo back the query parameters"
168
166
await request .get_data ()
169
167
echod = sorted ((k , v ) for k , v in request .args .items ())
170
168
return await make_response (repr (echod ))
171
169
172
170
173
171
@hypercorn_app .route ("/headers" , methods = ["GET" , "POST" ])
174
- async def headers () -> ResponseTypes :
172
+ async def headers () -> ResponseReturnValue :
175
173
return await make_response (dict (request .headers .items ()))
176
174
177
175
178
176
@hypercorn_app .route ("/headers_and_params" )
179
- async def headers_and_params () -> ResponseTypes :
177
+ async def headers_and_params () -> ResponseReturnValue :
180
178
return await make_response (
181
179
{
182
180
"headers" : dict (request .headers ),
@@ -186,12 +184,12 @@ async def headers_and_params() -> ResponseTypes:
186
184
187
185
188
186
@hypercorn_app .route ("/multi_headers" , methods = ["GET" , "POST" ])
189
- async def multi_headers () -> ResponseTypes :
187
+ async def multi_headers () -> ResponseReturnValue :
190
188
return await make_response ({"headers" : list (request .headers )})
191
189
192
190
193
191
@hypercorn_app .route ("/multi_redirect" )
194
- async def multi_redirect () -> ResponseTypes :
192
+ async def multi_redirect () -> ResponseReturnValue :
195
193
"Performs a redirect chain based on ``redirect_codes``"
196
194
params = request .args
197
195
codes = params .get ("redirect_codes" , "200" )
@@ -206,7 +204,7 @@ async def multi_redirect() -> ResponseTypes:
206
204
207
205
208
206
@hypercorn_app .route ("/encodingrequest" )
209
- async def encodingrequest () -> ResponseTypes :
207
+ async def encodingrequest () -> ResponseReturnValue :
210
208
"Check for UA accepting gzip/deflate encoding"
211
209
data = b"hello, world!"
212
210
encoding = request .headers .get ("Accept-Encoding" , "" )
@@ -230,7 +228,7 @@ async def encodingrequest() -> ResponseTypes:
230
228
231
229
232
230
@hypercorn_app .route ("/redirect" , methods = ["GET" , "POST" , "PUT" ])
233
- async def redirect () -> ResponseTypes :
231
+ async def redirect () -> ResponseReturnValue :
234
232
"Perform a redirect to ``target``"
235
233
values = await request .values
236
234
target = values .get ("target" , "/" )
@@ -242,7 +240,7 @@ async def redirect() -> ResponseTypes:
242
240
243
241
244
242
@hypercorn_app .route ("/redirect_after" )
245
- async def redirect_after () -> ResponseTypes :
243
+ async def redirect_after () -> ResponseReturnValue :
246
244
"Perform a redirect to ``target``"
247
245
params = request .args
248
246
date = params .get ("date" )
@@ -258,7 +256,7 @@ async def redirect_after() -> ResponseTypes:
258
256
259
257
260
258
@hypercorn_app .route ("/retry_after" )
261
- async def retry_after () -> ResponseTypes :
259
+ async def retry_after () -> ResponseReturnValue :
262
260
global LAST_RETRY_AFTER_REQ
263
261
params = request .args
264
262
if datetime .datetime .now () - LAST_RETRY_AFTER_REQ < datetime .timedelta (seconds = 1 ):
@@ -273,21 +271,21 @@ async def retry_after() -> ResponseTypes:
273
271
274
272
@hypercorn_app .route ("/status" )
275
273
@pyodide_testing_app .route ("/status" )
276
- async def status () -> ResponseTypes :
274
+ async def status () -> ResponseReturnValue :
277
275
values = await request .values
278
276
status = values .get ("status" , "200 OK" )
279
277
status_code = status .split (" " )[0 ]
280
278
return await make_response ("" , status_code )
281
279
282
280
283
281
@hypercorn_app .route ("/source_address" )
284
- async def source_address () -> ResponseTypes :
282
+ async def source_address () -> ResponseReturnValue :
285
283
"""Return the requester's IP address."""
286
284
return await make_response (request .remote_addr )
287
285
288
286
289
287
@hypercorn_app .route ("/successful_retry" , methods = ["GET" , "PUT" ])
290
- async def successful_retry () -> ResponseTypes :
288
+ async def successful_retry () -> ResponseReturnValue :
291
289
"""First return an error and then success
292
290
293
291
It's not currently very flexible as the number of retries is hard-coded.
@@ -305,35 +303,35 @@ async def successful_retry() -> ResponseTypes:
305
303
306
304
307
305
@pyodide_testing_app .after_request
308
- def apply_caching (response : ResponseTypes ) -> ResponseTypes :
306
+ def apply_caching (response : Response ) -> ResponseReturnValue :
309
307
for header , value in DEFAULT_HEADERS :
310
308
response .headers [header ] = value
311
309
return response
312
310
313
311
314
312
@pyodide_testing_app .route ("/slow" )
315
- async def slow () -> ResponseTypes :
313
+ async def slow () -> ResponseReturnValue :
316
314
await trio .sleep (10 )
317
315
return await make_response ("TEN SECONDS LATER" , 200 )
318
316
319
317
320
318
@pyodide_testing_app .route ("/bigfile" )
321
- async def bigfile () -> ResponseTypes :
319
+ async def bigfile () -> ResponseReturnValue :
322
320
# great big text file, should force streaming
323
321
# if supported
324
322
bigdata = 1048576 * b"WOOO YAY BOOYAKAH"
325
323
return await make_response (bigdata , 200 )
326
324
327
325
328
326
@pyodide_testing_app .route ("/mediumfile" )
329
- async def mediumfile () -> ResponseTypes :
327
+ async def mediumfile () -> ResponseReturnValue :
330
328
# quite big file
331
329
bigdata = 1024 * b"WOOO YAY BOOYAKAH"
332
330
return await make_response (bigdata , 200 )
333
331
334
332
335
333
@pyodide_testing_app .route ("/upload" , methods = ["POST" , "OPTIONS" ])
336
- async def pyodide_upload () -> ResponseTypes :
334
+ async def pyodide_upload () -> ResponseReturnValue :
337
335
if request .method == "OPTIONS" :
338
336
return await make_response ("" , 200 )
339
337
spare_data = await request .get_data (parse_form_data = True )
@@ -356,7 +354,7 @@ async def pyodide_upload() -> ResponseTypes:
356
354
357
355
358
356
@pyodide_testing_app .route ("/pyodide/<py_file>" )
359
- async def pyodide (py_file : str ) -> ResponseTypes :
357
+ async def pyodide (py_file : str ) -> ResponseReturnValue :
360
358
file_path = Path (pyodide_testing_app .config ["pyodide_dist_dir" ], py_file )
361
359
if file_path .exists ():
362
360
mime_type , encoding = mimetypes .guess_type (file_path )
@@ -370,7 +368,7 @@ async def pyodide(py_file: str) -> ResponseTypes:
370
368
371
369
372
370
@pyodide_testing_app .route ("/wheel/dist.whl" )
373
- async def wheel () -> ResponseTypes :
371
+ async def wheel () -> ResponseReturnValue :
374
372
# serve our wheel
375
373
wheel_folder = Path (__file__ ).parent .parent / "dist"
376
374
wheels = list (wheel_folder .glob ("*.whl" ))
0 commit comments