from fastapi import FastAPI
from starlette.types import Message
from starlette.requests import Request
from starlette.middleware.base import BaseHTTPMiddleware
import gzip
class GZipedMiddleware(BaseHTTPMiddleware):
async def set_body(self, request: Request):
receive_ = await request._receive()
if "gzip" in request.headers.getlist("Content-Encoding"):
print(receive_)
data = gzip.decompress(receive_.get('body'))
receive_['body'] = data
async def receive() -> Message:
return receive_
request._receive = receive
async def dispatch(self, request, call_next):
await self.set_body(request)
response = await call_next(request)
return response
app = FastAPI()
app.add_middleware(GZipedMiddleware)
@app.post("/post")
async def post(req: Request):
body = await req.body()
# I decode here, assuming that I just compressed
# a text file, in other use case you should use
# the appropiate decoder.
return body.decode("utf-8")