From 066907391aba966b0c4e1b85ae6ec240393315eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 18 Aug 2016 16:46:18 +0200 Subject: [PATCH] Only cache responses with status codes >= 200 and < 400 --- src/octoprint/server/util/flask.py | 8 ++++++++ src/octoprint/server/views.py | 15 ++++++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/octoprint/server/util/flask.py b/src/octoprint/server/util/flask.py index a2be3687..2788dd6c 100644 --- a/src/octoprint/server/util/flask.py +++ b/src/octoprint/server/util/flask.py @@ -395,6 +395,14 @@ def cache_check_response_headers(response): return False +def cache_check_status_code(response, valid): + if not isinstance(response, flask.Response): + return False + + if callable(valid): + return not valid(response.status_code) + else: + return response.status_code not in valid class PreemptiveCache(object): diff --git a/src/octoprint/server/views.py b/src/octoprint/server/views.py index 1153f14e..06cc232b 100644 --- a/src/octoprint/server/views.py +++ b/src/octoprint/server/views.py @@ -106,6 +106,9 @@ def _cache_key(ui, url=None, locale=None, additional_key_data=None): _logger.exception("Error while trying to retrieve additional cache key parts for ui {}".format(ui)) return k +def _valid_status_for_cache(status_code): + return 200 <= status_code < 400 + @app.route("/cached.gif") def in_cache(): url = request.base_url.replace("/cached.gif", "/") @@ -273,7 +276,7 @@ def index(): decorated_view = util.flask.cached(timeout=-1, refreshif=validate_cache, key=cache_key, - unless_response=util.flask.cache_check_response_headers)(decorated_view) + unless_response=lambda response: util.flask.cache_check_response_headers(response) or util.flask.cache_check_status_code(response, _valid_status_for_cache))(decorated_view) decorated_view = util.flask.conditional(check_etag_and_lastmodified, NOT_MODIFIED)(decorated_view) return decorated_view @@ -336,14 +339,12 @@ def index(): if forced_view: # we have view forced by the preemptive cache _logger.debug("Forcing rendering of view {}".format(forced_view)) - response = None if forced_view != "_default": plugin = pluginManager.get_plugin_info(forced_view, require_enabled=True) if plugin is not None and isinstance(plugin.implementation, octoprint.plugin.UiPlugin): response = plugin_view(plugin.implementation) - - if response is None: - return default_view() + else: + response = default_view() else: # select view from plugins and fall back on default view if no plugin will handle it @@ -356,9 +357,9 @@ def index(): break else: _logger.warn("UiPlugin {} returned an empty response".format(plugin._identifier)) - else: - response = default_view() + if response is None: + return abort(404) return response