tower-rs / tower-http

HTTP specific Tower utilities.
675 stars 156 forks source link

Skip compression for range requests #446

Closed ryanfowler closed 7 months ago

ryanfowler commented 9 months ago

This PR fixes broken range requests when using the compression middleware by skipping response body compression when the Content-Range header is present in the response. It also strips the Accept-Ranges response header when performing compression.

Motivation

Fixes https://github.com/tower-rs/tower-http/issues/416

Solution

I believe the correct behaviour for this library is to pass along the Range request header, and skip compression if the Content-Range response header is present. This will allow range requests if the wrapped services support them, and skip compression in that circumstance to avoid corruption. If the user would rather compress everything, they can disallow range requests by stripping out the Range request header in an earlier middleware.

Notably, this is how a prominent Go library handles range requests and compression:

ryanfowler commented 9 months ago

@jplatte thanks for the review! Added the comment and changelog entry 😄