xref: /unit/test/python/delayed/asgi.py (revision 1848)
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