summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/common/large.py
blob: 0db4e4bbd1cf08e61e7a74d8919b29395e358d37 (plain)
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
def main(request, response):
    """Code for generating large responses where the actual response data
    isn't very important.

    Two request parameters:
    size (required): An integer number of bytes (no suffix) or kilobytes
                     ("kb" suffix) or megabytes ("Mb" suffix).
    string (optional): The string to repeat in the response. Defaults to "a".

    Example:
        /resources/large.py?size=32Mb&string=ab
    """
    if not "size" in request.GET:
        400, "Need an integer bytes parameter"

    bytes_value = request.GET.first("size")

    chunk_size = 1024

    multipliers = {"kb": 1024,
                   "Mb": 1024*1024}

    suffix = bytes_value[-2:]
    if suffix in multipliers:
        multiplier = multipliers[suffix]
        bytes_value = bytes_value[:-2] * multiplier

    try:
        num_bytes = int(bytes_value)
    except ValueError:
        return 400, "Bytes must be an integer possibly with a kb or Mb suffix"

    string = str(request.GET.first("string", "a"))

    chunk = string * chunk_size

    def content():
        bytes_sent = 0
        while bytes_sent < num_bytes:
            if num_bytes - bytes_sent < len(chunk):
                yield chunk[num_bytes - bytes_sent]
            else:
                yield chunk
            bytes_sent += len(chunk)
    return [("Content-Type", "text/plain")], content()