Sorry for the delay. As you can see, it looks very similar.
import gzip
from functools import wraps
from io import BytesIO as IO
from sanic import Sanic, html
app = Sanic(__name__)
def gzipit(handler):
def decorator(f):
@wraps(f)
async def decorated_function(request, *args, **kwargs):
accept_encoding = request.headers.get("Accept-Encoding", "")
response = await f(request, *args, **kwargs)
if ("gzip" not in accept_encoding.lower()) or (
response.status < 200 or response.status >= 300 or "Content-Encoding" in response.headers
):
return response
gzip_buffer = IO()
gzip_file = gzip.GzipFile(mode="wb", fileobj=gzip_buffer)
gzip_file.write(response.body)
gzip_file.close()
response.body = gzip_buffer.getvalue()
response.headers["Content-Encoding"] = "gzip"
response.headers["Vary"] = "Accept-Encoding"
response.headers["Content-Length"] = len(response.body)
return response
return decorated_function
return decorator(handler)
@app.get("/")
@gzipit
async def handler(request):
return html(
"""
<html>
<h1>Hello, world.</h1>
</html>
"""
)