forked from forks/microblog.pub
Support gzip compression for JSON resp
This commit is contained in:
parent
5dd6385fe6
commit
972e129381
1 changed files with 19 additions and 1 deletions
|
@ -1,7 +1,10 @@
|
||||||
|
import gzip
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
from functools import wraps
|
from functools import wraps
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
from typing import Dict
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
from bson.objectid import ObjectId
|
from bson.objectid import ObjectId
|
||||||
|
@ -43,12 +46,27 @@ ap.use_backend(back)
|
||||||
MY_PERSON = ap.Person(**ME)
|
MY_PERSON = ap.Person(**ME)
|
||||||
|
|
||||||
|
|
||||||
|
def build_resp(resp):
|
||||||
|
"""Encode the response to gzip if supported by the client."""
|
||||||
|
headers = {}
|
||||||
|
accept_encoding = request.headers.get("Accept-Encoding", "")
|
||||||
|
if "gzip" in accept_encoding.lower():
|
||||||
|
return (
|
||||||
|
gzip.compress(resp.encode(), compresslevel=6),
|
||||||
|
{"Vary": "Accept-Encoding", "Content-Encoding": "gzip"},
|
||||||
|
)
|
||||||
|
|
||||||
|
return resp, headers
|
||||||
|
|
||||||
|
|
||||||
def jsonify(**data):
|
def jsonify(**data):
|
||||||
if "@context" not in data:
|
if "@context" not in data:
|
||||||
data["@context"] = config.DEFAULT_CTX
|
data["@context"] = config.DEFAULT_CTX
|
||||||
|
resp, headers = build_resp(json.dumps(data))
|
||||||
return Response(
|
return Response(
|
||||||
response=json.dumps(data),
|
response=resp,
|
||||||
headers={
|
headers={
|
||||||
|
**headers,
|
||||||
"Cache-Control": "max-age=0, private, must-revalidate",
|
"Cache-Control": "max-age=0, private, must-revalidate",
|
||||||
"Content-Type": "application/json"
|
"Content-Type": "application/json"
|
||||||
if app.debug
|
if app.debug
|
||||||
|
|
Loading…
Reference in a new issue