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