1import asyncio 2 3async def application(scope, receive, send): 4 assert scope['type'] == 'http' 5 6 body = b'' 7 while True: 8 m = await receive() 9 body += m.get('body', b'') 10 if not m.get('more_body', False): 11 break 12 13 headers = scope.get('headers', []) 14 15 def get_header(n, v=None): 16 for h in headers: 17 if h[0] == n: 18 return h[1] 19 return v 20 21 parts = int(get_header(b'x-parts', 1)) 22 delay = int(get_header(b'x-delay', 0)) 23 24 loop = asyncio.get_event_loop() 25 26 async def sleep(n): 27 future = loop.create_future() 28 loop.call_later(n, future.set_result, None) 29 await future 30 31 await send({ 32 'type': 'http.response.start', 33 'status': 200, 34 'headers': [ 35 (b'content-length', str(len(body)).encode()), 36 ] 37 }) 38 39 if not body: 40 await sleep(delay) 41 return 42 43 step = int(len(body) / parts) 44 for i in range(0, len(body), step): 45 await send({ 46 'type': 'http.response.body', 47 'body': body[i : i + step], 48 'more_body': True, 49 }) 50 51 await sleep(delay) 52