From efddcefb88d590df5de50211e371c38ca86981a8 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Mon, 28 Sep 2020 19:34:03 +0200 Subject: [PATCH 1/4] Raise 307 redirect before storage hit --- kinto_changes/views.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/kinto_changes/views.py b/kinto_changes/views.py index ab619e0..a131808 100644 --- a/kinto_changes/views.py +++ b/kinto_changes/views.py @@ -90,6 +90,9 @@ class Changes(resource.Resource): schema = ChangesSchema def __init__(self, request, context=None): + # Bypass call to storage if _since is too old. + _handle_old_since_redirect(request) + super(Changes, self).__init__(request, context) self.model = ChangesModel(request) @@ -99,7 +102,6 @@ def timestamp(self): def plural_get(self): result = super().plural_get() - _handle_old_since_redirect(self.request) _handle_cache_expires(self.request, MONITOR_BUCKET, CHANGES_COLLECTION) return result @@ -135,8 +137,13 @@ def _handle_old_since_redirect(request): See https://bugzilla.mozilla.org/show_bug.cgi?id=1529685 and https://bugzilla.mozilla.org/show_bug.cgi?id=1665319#c2 """ - qs_since = request.validated["querystring"].get("_since") - if qs_since is None: + try: + # request.validated is not populated yet (resource was not instantiated yet, + # we want to bypass storage). + qs_since_str = request.GET.get("_since", "") + qs_since = int(qs_since_str.strip('"')) + except (TypeError, ValueError): + # Will fail later during resource querystring validation. return settings = request.registry.settings @@ -240,13 +247,13 @@ def get_changeset(request): include_deleted = True if (bid, cid) == (MONITOR_BUCKET, CHANGES_COLLECTION): - model = ChangesModel(request) + # Redirect old since, on monitor/changes only. + _handle_old_since_redirect(request) + model = ChangesModel(request) metadata = {} timestamp = model.timestamp() changes = model.get_objects(filters=filters, include_deleted=include_deleted) - # Redirect old since, on monitor/changes only. - _handle_old_since_redirect(request) else: bucket_uri = instance_uri(request, "bucket", id=bid) From 1993cce4349d967cb587bd5b732c5f96617e5815 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Mon, 28 Sep 2020 19:34:34 +0200 Subject: [PATCH 2/4] Simplify inheritance by injecting model before resource init --- kinto_changes/views.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/kinto_changes/views.py b/kinto_changes/views.py index a131808..0bf07bc 100644 --- a/kinto_changes/views.py +++ b/kinto_changes/views.py @@ -92,13 +92,9 @@ class Changes(resource.Resource): def __init__(self, request, context=None): # Bypass call to storage if _since is too old. _handle_old_since_redirect(request) - - super(Changes, self).__init__(request, context) + # Inject custom model. self.model = ChangesModel(request) - - @property - def timestamp(self): - return self.model.timestamp() + super(Changes, self).__init__(request, context) def plural_get(self): result = super().plural_get() From 624ab223dad11a41e980ab6612a61c6d43325e13 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Mon, 28 Sep 2020 19:35:15 +0200 Subject: [PATCH 3/4] Update CHANGELOG --- CHANGELOG.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cbe6225..6853b5a 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,7 +4,9 @@ Changelog 3.2.0 (unreleased) ------------------ -- Nothing changed yet. +**Bug fixes** + +- Bypass storage when redirecting on old ``_since`` 3.1.0 (2020-09-22) From e03bae7e66e92c59ac9001697762144e33c43572 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Mon, 28 Sep 2020 21:46:09 +0200 Subject: [PATCH 4/4] Remove superfluous TypeError --- kinto_changes/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kinto_changes/views.py b/kinto_changes/views.py index 0bf07bc..9953860 100644 --- a/kinto_changes/views.py +++ b/kinto_changes/views.py @@ -138,7 +138,7 @@ def _handle_old_since_redirect(request): # we want to bypass storage). qs_since_str = request.GET.get("_since", "") qs_since = int(qs_since_str.strip('"')) - except (TypeError, ValueError): + except ValueError: # Will fail later during resource querystring validation. return