| 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() |