diff --git a/httpbin/core.py b/httpbin/core.py index 50e7524..446b581 100644 --- a/httpbin/core.py +++ b/httpbin/core.py @@ -204,6 +204,15 @@ def view_deflate_encoded_content(): 'origin', 'headers', method=request.method, deflated=True)) +@app.route('/brotli') +@filters.brotli +def view_brotli_encoded_content(): + """Returns Brotli-Encoded Data.""" + + return jsonify(get_dict( + 'origin', 'headers', method=request.method, brotli=True)) + + @app.route('/redirect/') def redirect_n_times(n): """302 Redirects n times.""" diff --git a/httpbin/filters.py b/httpbin/filters.py index e18382c..6bfd2fe 100644 --- a/httpbin/filters.py +++ b/httpbin/filters.py @@ -10,6 +10,8 @@ This module provides response filter decorators. import gzip as gzip2 import zlib +import brotli as _brotli + from six import BytesIO from decimal import Decimal from time import time as now @@ -88,3 +90,26 @@ def deflate(f, *args, **kwargs): return data return deflated_data + + +@decorator +def brotli(f, *args, **kwargs): + """Brotli Flask Response Decorator""" + + data = f(*args, **kwargs) + + if isinstance(data, Response): + content = data.data + else: + content = data + + deflated_data = _brotli.compress(content) + + if isinstance(data, Response): + data.data = deflated_data + data.headers['Content-Encoding'] = 'brotli' + data.headers['Content-Length'] = str(len(data.data)) + + return data + + return deflated_data diff --git a/setup.py b/setup.py index 7c70231..857c35a 100644 --- a/setup.py +++ b/setup.py @@ -32,5 +32,7 @@ setup( ], packages=find_packages(), include_package_data = True, # include files listed in MANIFEST.in - install_requires=['Flask','MarkupSafe','decorator','itsdangerous','six'], + install_requires=[ + 'Flask','MarkupSafe','decorator','itsdangerous','six','brotlipy' + ], )