""" This generates a partial response for a 100-byte text file. """ import re from wptserve.utils import isomorphic_decode def main(request, response): total_length = int(request.GET.first(b'length', b'100')) partial_code = int(request.GET.first(b'partial', b'206')) content_type = request.GET.first(b'type', b'text/plain') range_header = request.headers.get(b'Range', b'') # Send a 200 if there is no range request if not range_header: to_send = ''.zfill(total_length) response.headers.set(b"Content-Type", content_type) response.headers.set(b"Cache-Control", b"no-cache") response.headers.set(b"Content-Length", total_length) response.content = to_send return # Simple range parsing, requires specifically "bytes=xxx-xxxx" range_header_match = re.search(r'^bytes=(\d*)-(\d*)$', isomorphic_decode(range_header)) start, end = range_header_match.groups() start = int(start) end = int(end) if end else total_length length = end - start # Error the request if the range goes beyond the length if length <= 0 or end > total_length: response.set_error(416, u"Range Not Satisfiable") # set_error sets the MIME type to application/json, which - for a # no-cors media request - will be blocked by ORB. We'll just force # the expected MIME type here, whichfixes the test, but doesn't make # sense in general. response.headers = [(b"Content-Type", content_type)] response.write() return # Generate a partial response of the requested length to_send = ''.zfill(length) response.headers.set(b"Content-Type", content_type) response.headers.set(b"Accept-Ranges", b"bytes") response.headers.set(b"Cache-Control", b"no-cache") response.status = partial_code content_range = b"bytes %d-%d/%d" % (start, end, total_length) response.headers.set(b"Content-Range", content_range) response.headers.set(b"Content-Length", length) response.content = to_send