summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hellkamp <marc@gsites.de>2022-06-14 10:59:44 +0200
committerMarcel Hellkamp <marc@gsites.de>2022-06-14 10:59:44 +0200
commit21453baec0d47761183240b32401af15d3ae76aa (patch)
tree360e7b8e94067bd8064decdb537daa9faa30e72d
parent8dbae77560a13f04c8a622b575c924ed9918d22d (diff)
downloadbottle-21453baec0d47761183240b32401af15d3ae76aa.tar.gz
fix: Static file not closed on range requests
-rwxr-xr-xbottle.py18
1 files changed, 8 insertions, 10 deletions
diff --git a/bottle.py b/bottle.py
index fa47523..6c852ab 100755
--- a/bottle.py
+++ b/bottle.py
@@ -2832,18 +2832,15 @@ def redirect(url, code=None):
raise res
-def _file_iter_range(fp, offset, bytes, maxread=1024 * 1024, close=False):
- """ Yield chunks from a range in a file, optionally closing it at the end.
- No chunk is bigger than maxread. """
+def _rangeiter(fp, offset, limit, bufsize=1024 * 1024):
+ """ Yield chunks from a range in a file. """
fp.seek(offset)
- while bytes > 0:
- part = fp.read(min(bytes, maxread))
+ while limit > 0:
+ part = fp.read(min(limit, bufsize))
if not part:
break
- bytes -= len(part)
+ limit -= len(part)
yield part
- if close:
- fp.close()
def static_file(filename, root,
@@ -2947,9 +2944,10 @@ def static_file(filename, root,
if not ranges:
return HTTPError(416, "Requested Range Not Satisfiable")
offset, end = ranges[0]
+ rlen = end - offset
headers["Content-Range"] = "bytes %d-%d/%d" % (offset, end - 1, clen)
- headers["Content-Length"] = str(end - offset)
- if body: body = _file_iter_range(body, offset, end - offset, close=True)
+ headers["Content-Length"] = str(rlen)
+ if body: body = _closeiter(_rangeiter(body, offset, rlen), body.close)
return HTTPResponse(body, status=206, **headers)
return HTTPResponse(body, **headers)