From 02933a9c939aacc1759d53b758cda0dd461895c4 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Tue, 15 Mar 2022 16:21:14 +0200 Subject: [PATCH] Support disabling response compression Return fixed server header --- apiserver/server_init/app_sequence.py | 6 +++++- apiserver/server_init/request_handlers.py | 8 ++++++++ apiserver/utilities/env.py | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 apiserver/utilities/env.py diff --git a/apiserver/server_init/app_sequence.py b/apiserver/server_init/app_sequence.py index 354dc4b..cf14bb9 100644 --- a/apiserver/server_init/app_sequence.py +++ b/apiserver/server_init/app_sequence.py @@ -25,6 +25,7 @@ from apiserver.server_init.request_handlers import RequestHandlers from apiserver.service_repo import ServiceRepo from apiserver.sync import distributed_lock from apiserver.updates import check_updates_thread +from apiserver.utilities.env import get_bool from apiserver.utilities.threads_manager import ThreadsManager log = config.logger(__file__) @@ -46,10 +47,13 @@ class AppSequence: def _attach_request_handlers(self, request_handlers: RequestHandlers): self.app.before_first_request(request_handlers.before_app_first_request) self.app.before_request(request_handlers.before_request) + self.app.after_request(request_handlers.after_request) def _configure(self): CORS(self.app, **config.get("apiserver.cors")) - Compress(self.app) + + if get_bool("CLEARML_COMPRESS_RESP", default=True): + Compress(self.app) self.app.config["SECRET_KEY"] = config.get( "secure.http.session_secret.apiserver" diff --git a/apiserver/server_init/request_handlers.py b/apiserver/server_init/request_handlers.py index 3176a54..e419def 100644 --- a/apiserver/server_init/request_handlers.py +++ b/apiserver/server_init/request_handlers.py @@ -18,6 +18,7 @@ log = config.logger(__file__) class RequestHandlers: _request_strip_prefix = config.get("apiserver.request.strip_prefix", None) + _server_header = config.get("apiserver.response.headers.server", "clearml") def before_app_first_request(self): pass @@ -28,6 +29,9 @@ class RequestHandlers: if "/static/" in request.path: return + if request.content_encoding: + return f"Content encoding is not supported ({request.content_encoding})", 415 + try: call = self._create_api_call(request) load_data_callback = partial(self._load_call_data, req=request) @@ -81,6 +85,10 @@ class RequestHandlers: log.exception(f"Failed processing request {request.url}: {ex}") return f"Failed processing request {request.url}", 500 + def after_request(self, response): + response.headers["server"] = self._server_header + return response + @staticmethod def _apply_multi_dict(body: dict, md: ImmutableMultiDict): def convert_value(v: str): diff --git a/apiserver/utilities/env.py b/apiserver/utilities/env.py new file mode 100644 index 0000000..6f33357 --- /dev/null +++ b/apiserver/utilities/env.py @@ -0,0 +1,14 @@ +from distutils.util import strtobool +from os import getenv +from typing import Optional + + +def get_bool(*keys: str, default: bool = None) -> Optional[bool]: + try: + value = next(env for env in (getenv(key) for key in keys) if env is not None) + except StopIteration: + return default + try: + return bool(strtobool(value)) + except ValueError: + return bool(value)