From 82be1840b08a7fc718b8fd3aaecada7484c40e72 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Sun, 21 Jun 2020 23:55:52 +0300 Subject: [PATCH] Add fileserver default cache timeout for downloaded files --- fileserver/config/basic.py | 33 ++++++++++++++++++++--- fileserver/config/default/fileserver.conf | 3 +++ fileserver/fileserver.py | 1 + 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/fileserver/config/basic.py b/fileserver/config/basic.py index 946f6ba..6b26fdb 100644 --- a/fileserver/config/basic.py +++ b/fileserver/config/basic.py @@ -1,4 +1,5 @@ import logging +import os from functools import reduce from os import getenv from os.path import expandvars @@ -16,6 +17,9 @@ DEFAULT_EXTRA_CONFIG_PATH = "/opt/trains/config" EXTRA_CONFIG_PATH_ENV_KEY = "TRAINS_CONFIG_DIR" EXTRA_CONFIG_PATH_SEP = ":" +EXTRA_CONFIG_VALUES_ENV_KEY_SEP = "__" +EXTRA_CONFIG_VALUES_ENV_KEY_PREFIX = f"TRAINS{EXTRA_CONFIG_VALUES_ENV_KEY_SEP}" + class BasicConfig: NotSet = object() @@ -46,7 +50,23 @@ class BasicConfig: path = ".".join((self.prefix, Path(name).stem)) return logging.getLogger(path) - def _read_env_paths(self, key): + @staticmethod + def _read_extra_env_config_values(): + """ Loads extra configuration from environment-injected values """ + result = ConfigTree() + prefix = EXTRA_CONFIG_VALUES_ENV_KEY_PREFIX + + keys = sorted(k for k in os.environ if k.startswith(prefix)) + for key in keys: + path = key[len(prefix) :].replace(EXTRA_CONFIG_VALUES_ENV_KEY_SEP, ".").lower() + result = ConfigTree.merge_configs( + result, ConfigFactory.parse_string(f"{path}: {os.environ[key]}") + ) + + return result + + @staticmethod + def _read_env_paths(key): value = getenv(EXTRA_CONFIG_PATH_ENV_KEY, DEFAULT_EXTRA_CONFIG_PATH) if value is None: return @@ -64,12 +84,17 @@ class BasicConfig: def _load(self, verbose=True): extra_config_paths = self._read_env_paths(EXTRA_CONFIG_PATH_ENV_KEY) or [] + extra_config_values = self._read_extra_env_config_values() + configs = [ + self._read_recursive(path, verbose=verbose) + for path in [self.folder] + extra_config_paths + ] self._config = reduce( - lambda config, path: ConfigTree.merge_configs( - config, self._read_recursive(path, verbose=verbose), copy_trees=True + lambda last, config: ConfigTree.merge_configs( + last, config, copy_trees=True ), - [self.folder] + extra_config_paths, + configs + [extra_config_values], ConfigTree(), ) diff --git a/fileserver/config/default/fileserver.conf b/fileserver/config/default/fileserver.conf index 5e197a4..d2e3b40 100644 --- a/fileserver/config/default/fileserver.conf +++ b/fileserver/config/default/fileserver.conf @@ -1,6 +1,9 @@ download { # Add response headers requesting no caching for served files disable_browser_caching: false + + # Cache timeout to be set for downloaded files + cache_timeout_sec: 300 } cors { diff --git a/fileserver/fileserver.py b/fileserver/fileserver.py index d697a3c..3a2d8e9 100644 --- a/fileserver/fileserver.py +++ b/fileserver/fileserver.py @@ -17,6 +17,7 @@ CORS(app, **config.get("fileserver.cors")) Compress(app) app.config["UPLOAD_FOLDER"] = os.environ.get("TRAINS_UPLOAD_FOLDER") or DEFAULT_UPLOAD_FOLDER +app.config["SEND_FILE_MAX_AGE_DEFAULT"] = config.get("fileserver.download.cache_timeout_sec", 5 * 60) @app.route("/", methods=["POST"])