| #!/usr/bin/env python3 |
| |
| import os |
| import sys |
| import time |
| from urllib.parse import parse_qs |
| |
| query = parse_qs(os.environ.get('QUERY_STRING', ''), keep_blank_values=True) |
| name = query.get('name', [''])[0] |
| stall_at = query.get('stallAt', [None])[0] |
| stall_for = query.get('stallFor', [None])[0] |
| stall_repeat = query.get('stallRepeat', [None])[0] |
| mime_type = query.get('mimeType', [''])[0] |
| |
| if not os.path.isfile(name): |
| sys.stdout.write('Content-Type: text/html\r\n\r\n') |
| sys.exit(0) |
| |
| name = os.path.abspath(name) |
| |
| open_file = open(name, 'rb') |
| file_size = os.path.getsize(name) |
| content = open_file.read() |
| |
| sys.stdout.write( |
| 'Content-Type: {}\r\n' |
| 'Content-Length: {}\r\n\r\n'.format(mime_type, file_size) |
| ) |
| |
| if stall_at is not None and stall_for is not None: |
| stall_at = int(stall_at) |
| stall_for = float(stall_for) |
| |
| if stall_at > file_size: |
| sys.stdout.write('Incorrect value for stallAt.') |
| sys.exit(0) |
| |
| written_total = 0 |
| while written_total < file_size: |
| stall_at = min(stall_at, file_size - written_total) |
| written = 0 |
| |
| while written < stall_at: |
| write = min(1024, stall_at - written) |
| |
| sys.stdout.flush() |
| sys.stdout.buffer.write(content[written_total + written:written_total + written + write]) |
| sys.stdout.flush() |
| |
| written += write |
| |
| written_total += written |
| remaining = file_size - written_total |
| |
| if remaining == 0: |
| break |
| |
| time.sleep(stall_for) |
| if stall_repeat is None: |
| stall_at = remaining |
| else: |
| sys.stdout.flush() |
| sys.stdout.buffer.write(content) |
| sys.stdout.flush() |
| |
| open_file.close() |