Source code

Revision control

Copy as Markdown

Other Tools

import os
import re
import time
from wptserve.utils import isomorphic_decode
BYTE_RANGE_RE = re.compile(r"bytes=(\d+)-(\d+)?$")
def main(request, response):
chunk_size = int(request.GET.first(b"chunksize", b"1024"))
chunk_delay = float(request.GET.first(b"chunkdelay", b"16")) / 1E3
path = os.path.join(os.path.dirname(os.path.abspath(__file__)), u"linearized.pdf")
with open(path, u"rb") as file:
content = file.read()
total_length = len(content)
first_byte = 0
last_byte = total_length - 1
range_header = request.headers.get(b"Range", b"")
if range_header:
match = BYTE_RANGE_RE.match(isomorphic_decode(range_header))
if not match:
response.status = 416
return b""
first_byte = int(match.group(1))
if match.group(2) is not None:
last_byte = min(int(match.group(2)), last_byte)
response.status = 206
response.headers.set(b"Content-Range", b"bytes %d-%d/%d" % (first_byte, last_byte, total_length))
else:
response.status = 200
content = content[first_byte:last_byte + 1]
response.headers.set(b"Content-Type", b"application/pdf")
response.headers.set(b"Accept-Ranges", b"bytes")
response.headers.set(b"Content-Length", b"%d" % len(content))
response.headers.set(b"Cache-Control", b"no-cache, no-store, must-revalidate")
response.write_status_headers()
for offset in range(0, len(content), chunk_size):
response.writer.write_content(content[offset:offset + chunk_size])
time.sleep(chunk_delay)