From b2bec66dc9233cf1020ea2997244ef4b34c866c3 Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Mon, 5 Oct 2015 12:17:52 +0100 Subject: [PATCH] Add a Brotli endpoint. --- httpbin/core.py | 9 +++++++++ httpbin/filters.py | 25 +++++++++++++++++++++++++ setup.py | 4 +++- 3 files changed, 37 insertions(+), 1 deletion(-) 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' + ], )