Skip to content

Instantly share code, notes, and snippets.

@guydou
Created April 8, 2019 05:49
Show Gist options
  • Save guydou/731c60751115ba23abe5d391035699eb to your computer and use it in GitHub Desktop.
Save guydou/731c60751115ba23abe5d391035699eb to your computer and use it in GitHub Desktop.
RangeResponse
from flask import request, Response
import re
class ResponseRange(Response):
""" A response that gets stream and returns partial content
"""
def __init__(self, response, *args, **kwargs):
stream = response
file_size = len(stream)
range_header = request.headers.get('Range', None)
headers = set()
status_code = None
if range_header:
m = re.search('([0-9]+)-([0-9]*)', range_header) # example: 0-1000 or 1250-
g = m.groups()
byte1, byte2 = 0, None
if g[0]:
byte1 = int(g[0])
if g[1]:
byte2 = int(g[1])
if byte1 < file_size:
start = byte1
if byte2:
length = byte2 + 1 - byte1
else:
length = file_size - start
stream.seek(start)
value = stream.read(length)
status_code = 206
headers.add(('Content-Range', 'bytes {0}-{1}/{2}'.format(start, start + length - 1, file_size)))
else:
value = value.read()
super().__init__(value, *args, **kwargs)
if headers:
for k,v in headers:
self.headers.add(k, v)
if status_code:
self.status_code = status_code
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment