pallets / quart

An async Python micro framework for building web applications.
https://quart.palletsprojects.com
MIT License
3.01k stars 164 forks source link

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

Closed jeffpeng3 closed 6 months ago

jeffpeng3 commented 7 months ago

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: