From 9ca67d9228671cfba112c5db1291083241a7ed9d Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 17 Oct 2018 15:11:16 +0100 Subject: [PATCH 1/2] Support ASGI middleware --- responder/api.py | 9 ++++++++ responder/models.py | 52 ++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/responder/api.py b/responder/api.py index ab73130..2f00fa4 100644 --- a/responder/api.py +++ b/responder/api.py @@ -11,6 +11,7 @@ from graphql_server import encode_execution_results, json_encode, default_format from starlette.routing import Router from starlette.staticfiles import StaticFiles from starlette.testclient import TestClient +from starlette.middleware.gzip import GZipMiddleware from apispec import APISpec from apispec.ext.marshmallow import MarshmallowPlugin from apispec import yaml_utils @@ -76,6 +77,8 @@ class API: self.add_route(openapi_route, self.schema_response) self.default_endpoint = None + self.app = self.dispatch + self.add_middleware(GZipMiddleware) @property def _apispec(self): @@ -102,6 +105,9 @@ class API: def openapi(self): return self._apispec.to_yaml() + def add_middleware(self, middleware_cls, **middleware_config): + self.app = middleware_cls(self.app, **middleware_config) + def __call__(self, scope): path = scope["path"] root_path = scope.get("root_path", "") @@ -117,6 +123,9 @@ class API: app = WsgiToAsgi(app) return app(scope) + return self.app(scope) + + def dispatch(self, scope): # Call the main dispatcher. async def asgi(receive, send): nonlocal scope, self diff --git a/responder/models.py b/responder/models.py index cecc31b..0f14dee 100644 --- a/responder/models.py +++ b/responder/models.py @@ -250,35 +250,35 @@ class Response: {"Content-Type": "application/json"}, ) - @property - async def gzipped_body(self): - - body, headers = await self.body - - if isinstance(body, str): - body = body.encode(self.encoding) - - if "gzip" in self.req.headers["Accept-Encoding"].lower(): - gzip_buffer = io.BytesIO() - gzip_file = gzip.GzipFile(mode="wb", fileobj=gzip_buffer) - gzip_file.write(body) - gzip_file.close() - - new_headers = { - "Content-Encoding": "gzip", - "Vary": "Accept-Encoding", - "Content-Length": str(len(body)), - } - headers.update(new_headers) - - return (gzip_buffer.getvalue(), headers) - else: - return (body, headers) + # @property + # async def gzipped_body(self): + # + # body, headers = await self.body + # + # if isinstance(body, str): + # body = body.encode(self.encoding) + # + # if "gzip" in self.req.headers["Accept-Encoding"].lower(): + # gzip_buffer = io.BytesIO() + # gzip_file = gzip.GzipFile(mode="wb", fileobj=gzip_buffer) + # gzip_file.write(body) + # gzip_file.close() + # + # new_headers = { + # "Content-Encoding": "gzip", + # "Vary": "Accept-Encoding", + # "Content-Length": str(len(body)), + # } + # headers.update(new_headers) + # + # return (gzip_buffer.getvalue(), headers) + # else: + # return (body, headers) async def __call__(self, receive, send): body, headers = await self.body - if len(await self.body) > 500: - body, headers = await self.gzipped_body + # if len(await self.body) > 500: + # body, headers = await self.gzipped_body if self.headers: headers.update(self.headers) From fbac81c245fcfdd4bf84735c5df46488ebc25553 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Wed, 17 Oct 2018 15:13:09 +0100 Subject: [PATCH 2/2] Drop commented out gzip code --- responder/models.py | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/responder/models.py b/responder/models.py index 0f14dee..7fac2c2 100644 --- a/responder/models.py +++ b/responder/models.py @@ -250,35 +250,8 @@ class Response: {"Content-Type": "application/json"}, ) - # @property - # async def gzipped_body(self): - # - # body, headers = await self.body - # - # if isinstance(body, str): - # body = body.encode(self.encoding) - # - # if "gzip" in self.req.headers["Accept-Encoding"].lower(): - # gzip_buffer = io.BytesIO() - # gzip_file = gzip.GzipFile(mode="wb", fileobj=gzip_buffer) - # gzip_file.write(body) - # gzip_file.close() - # - # new_headers = { - # "Content-Encoding": "gzip", - # "Vary": "Accept-Encoding", - # "Content-Length": str(len(body)), - # } - # headers.update(new_headers) - # - # return (gzip_buffer.getvalue(), headers) - # else: - # return (body, headers) - async def __call__(self, receive, send): body, headers = await self.body - # if len(await self.body) > 500: - # body, headers = await self.gzipped_body if self.headers: headers.update(self.headers)