summaryrefslogtreecommitdiffhomepage
path: root/test/python/delayed/asgi.py
blob: 1cb15a922afda94c79489eb571fa4b95a44053ab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import asyncio


async def application(scope, receive, send):
    assert scope['type'] == 'http'

    body = b''
    while True:
        m = await receive()
        body += m.get('body', b'')
        if not m.get('more_body', False):
            break

    headers = scope.get('headers', [])

    def get_header(n, v=None):
        for h in headers:
            if h[0] == n:
                return h[1]
        return v

    parts = int(get_header(b'x-parts', 1))
    delay = int(get_header(b'x-delay', 0))

    loop = asyncio.get_event_loop()

    async def sleep(n):
        future = loop.create_future()
        loop.call_later(n, future.set_result, None)
        await future

    await send(
        {
            'type': 'http.response.start',
            'status': 200,
            'headers': [(b'content-length', str(len(body)).encode()),],
        }
    )

    if not body:
        await sleep(delay)
        return

    step = int(len(body) / parts)
    for i in range(0, len(body), step):
        await send(
            {
                'type': 'http.response.body',
                'body': body[i : i + step],
                'more_body': True,
            }
        )

        await sleep(delay)