-
-
Notifications
You must be signed in to change notification settings - Fork 7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
GZip Middleware Throws "Response content longer than Content-Length" when given a 304 empty-body response #4050
Comments
FYI, I believe this reproduces on any empty response (confirmed on 204 as well, 200 works as it technically has a body) |
I have the same issue for a year already. I guess it's a Starlette problem |
Experiencing the same issue with a |
We encountered this problem when developing our internal application, when we implemented both Brotli and GZIP compression. We tested the following fix using several use cases. |
This can be reproduced even without the from fastapi import FastAPI
app = FastAPI()
@app.get("/", status_code=204)
def endpoint():
print("Oh, hi mark") More details in this Starlette issue: encode/starlette#1764 I'm fixing it on Starlette here: encode/starlette#1765 And I'm fixing it on FastAPI here: #5145 It will be available in the next version, released in some hours, FastAPI |
@tiangolo I just tried FastAPI 0.79.0 but sadly the issue is still happening, at least with Gzip middleware enabled. |
@tiangolo I think we need to update starlette version in FastAPI dependencies, the issue with GZip Middleware was fixed in 0.20.1 encode/starlette#1579 Currently fix provided by #5145 does not work if GZip Middleware is used. |
Those 2 are different issues. |
@tiangolo I mean, those are different issues, but both were fixed. |
Ah! Great, thanks @Kludex ! 🚀 |
Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs. |
First Check
Commit to Help
Example Code
Description
curl -sH "Accept-Encoding: gzip" localhost:8000
This will reliably:
a) Give the expected 304 empty response.
b) Show a stack trace "Response content longer than Content-Length"
The root cause I believe is the base middleware (in this example the noop one) creates a StreamingResponse for what is ultimately an empty response, it consists of two streaming chunks ("", more=True), ("", more=False); which bypasses the minimum length check in the GZip middleware.
GZip then compresses the 'nothing' resulting in the GZip minimum boilerplate, but an expected content length of 0 then throws. This is post-response so the client wont see the error but the server will.
Operating System
Linux, macOS
Operating System Details
Don't think this is relevant.
FastAPI Version
0.63.0
Python Version
3.8.10
Additional Context
This is actually the root cause of issue: #2818
In the case of that issue the trigger is the StaticFiles mount has not-modified support, and on getting a non-modified static resource returns a 304. I suspect the original issue reporter stopped running into it either as a by-product of not getting 304 as often, or alternatively changing their middleware so as not to create the StreamingResponse.
The text was updated successfully, but these errors were encountered: