quart icon indicating copy to clipboard operation
quart copied to clipboard

The parameter of ContentRange in quart.wrappers.Response._process_range_request is not correct.

Open jeffpeng3 opened this issue 1 year ago • 0 comments

I've found a bug about ContentRange .

This is how it is used in quart:

self.headers["Accept-Ranges"] = accept_ranges
self.content_range = ContentRange(
    request_range.units,
    self.response.begin, # type: ignore
    self.response.end - 1, # type: ignore
    Completion length,
)
self.status_code = 206

Then in werkzeug it is converted to a header like this:

def to_header(self):
    """Converts the object back into an HTTP header."""
    ranges = []
    for begin, end in self.ranges:
        if end is None:
            ranges.append(f"{begin}-" if begin >= 0 else str(begin))
        else:
            ranges.append(f"{begin}-{end - 1}")
    return f"{self.units}={','.join(ranges)}"

For example, request header is 792-1955, request.range is 792-1955, response.begin and response.end are 792-1956, content_range:ContentRange is 792-1955, when converted to response header, it is 792-1954.

I think this is a quart problem, according to werkzeug's documentation, end is not included in the range, so end should not be reduced by one.

Environment:

  • Python version:3.12.2
  • Quart version:0.19.4

jeffpeng3 avatar Apr 02 '24 14:04 jeffpeng3