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