11626Smax.romanov@nginx.comimport asyncio 21626Smax.romanov@nginx.com 3*1848Szelenkov@nginx.com 41626Smax.romanov@nginx.comasync def application(scope, receive, send): 51626Smax.romanov@nginx.com assert scope['type'] == 'http' 61626Smax.romanov@nginx.com 71626Smax.romanov@nginx.com body = b'' 81626Smax.romanov@nginx.com while True: 91626Smax.romanov@nginx.com m = await receive() 101626Smax.romanov@nginx.com body += m.get('body', b'') 111626Smax.romanov@nginx.com if not m.get('more_body', False): 121626Smax.romanov@nginx.com break 131626Smax.romanov@nginx.com 141626Smax.romanov@nginx.com headers = scope.get('headers', []) 151626Smax.romanov@nginx.com 161626Smax.romanov@nginx.com def get_header(n, v=None): 171626Smax.romanov@nginx.com for h in headers: 181626Smax.romanov@nginx.com if h[0] == n: 191626Smax.romanov@nginx.com return h[1] 201626Smax.romanov@nginx.com return v 211626Smax.romanov@nginx.com 221626Smax.romanov@nginx.com parts = int(get_header(b'x-parts', 1)) 231626Smax.romanov@nginx.com delay = int(get_header(b'x-delay', 0)) 241626Smax.romanov@nginx.com 251626Smax.romanov@nginx.com loop = asyncio.get_event_loop() 261626Smax.romanov@nginx.com 271626Smax.romanov@nginx.com async def sleep(n): 281626Smax.romanov@nginx.com future = loop.create_future() 291626Smax.romanov@nginx.com loop.call_later(n, future.set_result, None) 301626Smax.romanov@nginx.com await future 311626Smax.romanov@nginx.com 32*1848Szelenkov@nginx.com await send( 33*1848Szelenkov@nginx.com { 34*1848Szelenkov@nginx.com 'type': 'http.response.start', 35*1848Szelenkov@nginx.com 'status': 200, 36*1848Szelenkov@nginx.com 'headers': [(b'content-length', str(len(body)).encode()),], 37*1848Szelenkov@nginx.com } 38*1848Szelenkov@nginx.com ) 391626Smax.romanov@nginx.com 401626Smax.romanov@nginx.com if not body: 411626Smax.romanov@nginx.com await sleep(delay) 421626Smax.romanov@nginx.com return 431626Smax.romanov@nginx.com 441626Smax.romanov@nginx.com step = int(len(body) / parts) 451626Smax.romanov@nginx.com for i in range(0, len(body), step): 46*1848Szelenkov@nginx.com await send( 47*1848Szelenkov@nginx.com { 48*1848Szelenkov@nginx.com 'type': 'http.response.body', 49*1848Szelenkov@nginx.com 'body': body[i : i + step], 50*1848Szelenkov@nginx.com 'more_body': True, 51*1848Szelenkov@nginx.com } 52*1848Szelenkov@nginx.com ) 531626Smax.romanov@nginx.com 541626Smax.romanov@nginx.com await sleep(delay) 55