Skip to content

Commit c92eaf2

Browse files
authored
allow for overriding cache decorator ttl on response (#18101)
This is primarily to support discriminating between HTML and JSON rendered /simple/ index cache times. In support of pypa/bandersnatch#1898
1 parent 5f7d43c commit c92eaf2

File tree

3 files changed

+36
-1
lines changed

3 files changed

+36
-1
lines changed

tests/unit/cache/origin/test_fastly.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,33 @@ def test_adds_surrogate_control(self):
211211
),
212212
}
213213

214+
def test_override_ttl_on_response(self):
215+
request = pretend.stub()
216+
response = pretend.stub(headers={}, override_ttl=6969)
217+
218+
cacher = fastly.FastlyCache(
219+
api_endpoint=None,
220+
api_connect_via=None,
221+
api_key=None,
222+
service_id=None,
223+
purger=None,
224+
)
225+
cacher.cache(
226+
["abc", "defg"],
227+
request,
228+
response,
229+
seconds=9123,
230+
stale_while_revalidate=4567,
231+
stale_if_error=2276,
232+
)
233+
234+
assert response.headers == {
235+
"Surrogate-Key": "abc defg",
236+
"Surrogate-Control": (
237+
"max-age=6969, stale-while-revalidate=4567, stale-if-error=2276"
238+
),
239+
}
240+
214241
def test_multiple_calls_to_cache_dont_overwrite_surrogate_keys(self):
215242
request = pretend.stub()
216243
response = pretend.stub(headers={})

warehouse/api/simple.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ def simple_index(request):
7878
# to return the correct content types.
7979
request.response.content_type = _select_content_type(request)
8080
if request.response.content_type == MIME_PYPI_SIMPLE_V1_JSON:
81+
request.response.override_ttl = 30 * 60 # 30 minutes
8182
request.override_renderer = "json"
8283

8384
# Apply CORS headers.

warehouse/cache/origin/fastly.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,21 @@ def cache(
7777
stale_while_revalidate=None,
7878
stale_if_error=None,
7979
):
80+
override_ttl = None
81+
if hasattr(response, "override_ttl"):
82+
override_ttl = response.override_ttl
83+
8084
existing_keys = set(response.headers.get("Surrogate-Key", "").split())
8185

8286
response.headers["Surrogate-Key"] = " ".join(sorted(set(keys) | existing_keys))
8387

8488
values = []
8589

8690
if seconds is not None:
87-
values.append(f"max-age={seconds}")
91+
if override_ttl is not None:
92+
values.append(f"max-age={override_ttl}")
93+
else:
94+
values.append(f"max-age={seconds}")
8895

8996
if stale_while_revalidate is not None:
9097
values.append(f"stale-while-revalidate={stale_while_revalidate}")

0 commit comments

Comments
 (0)