summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook@pioneer.com>2021-09-18 18:03:35 -0500
committerJordan Cook <jordan.cook@pioneer.com>2021-09-18 18:24:45 -0500
commit28e99c38090e986cda1145dfbc458e15085450a9 (patch)
tree28de778a186b82b7fdf19b45c05b24893cfcfc8f
parent86faa864900445e588b826004d594e8ab40a1c33 (diff)
downloadrequests-cache-28e99c38090e986cda1145dfbc458e15085450a9.tar.gz
Support expire_after param for CachedSession.send()
-rw-r--r--requests_cache/cache_control.py2
-rw-r--r--requests_cache/session.py6
-rw-r--r--tests/unit/test_session.py16
3 files changed, 22 insertions, 2 deletions
diff --git a/requests_cache/cache_control.py b/requests_cache/cache_control.py
index 434c5c2..418ac29 100644
--- a/requests_cache/cache_control.py
+++ b/requests_cache/cache_control.py
@@ -70,6 +70,7 @@ class CacheActions:
cache_control: bool = False,
session_expire_after: ExpirationTime = None,
urls_expire_after: ExpirationPatterns = None,
+ request_expire_after: ExpirationTime = None,
**kwargs,
):
"""Initialize from request info and cache settings"""
@@ -77,6 +78,7 @@ class CacheActions:
directives = get_cache_directives(request.headers)
expire_after = coalesce(
directives.get('max-age'),
+ request_expire_after,
get_url_expiration(request.url, urls_expire_after),
session_expire_after,
)
diff --git a/requests_cache/session.py b/requests_cache/session.py
index fcf2bb0..a60c93e 100644
--- a/requests_cache/session.py
+++ b/requests_cache/session.py
@@ -109,7 +109,6 @@ class CacheMixin(MIXIN_BASE):
5. :py:meth:`.BaseCache.get_response`
6. :py:meth:`requests.Session.send` (if not previously cached)
7. :py:meth:`.BaseCache.save_response` (if not previously cached)
-
"""
# If present, set per-request expiration as a request header, to be handled in send()
if expire_after is not None:
@@ -127,13 +126,16 @@ class CacheMixin(MIXIN_BASE):
**kwargs,
)
- def send(self, request: PreparedRequest, **kwargs) -> AnyResponse:
+ def send(
+ self, request: PreparedRequest, expire_after: ExpirationTime = None, **kwargs
+ ) -> AnyResponse:
"""Send a prepared request, with caching. See :py:meth:`.request` for notes on behavior."""
# Determine which actions to take based on request info, headers, and cache settings
cache_key = self.cache.create_key(request, **kwargs)
actions = CacheActions.from_request(
cache_key=cache_key,
request=request,
+ request_expire_after=expire_after,
session_expire_after=self.expire_after,
urls_expire_after=self.urls_expire_after,
cache_control=self.cache_control,
diff --git a/tests/unit/test_session.py b/tests/unit/test_session.py
index 73f522a..150a650 100644
--- a/tests/unit/test_session.py
+++ b/tests/unit/test_session.py
@@ -9,6 +9,7 @@ from unittest.mock import patch
import pytest
import requests
+from requests import Request
from requests.structures import CaseInsensitiveDict
from requests_cache import ALL_METHODS, CachedResponse, CachedSession
@@ -659,6 +660,21 @@ def test_per_request__expiration(mock_session):
mock_session.expire_after = None
response = mock_session.get(MOCKED_URL, expire_after=1)
assert response.from_cache is False
+ assert mock_session.get(MOCKED_URL).from_cache is True
+
+ time.sleep(1)
+ response = mock_session.get(MOCKED_URL)
+ assert response.from_cache is False
+
+
+def test_per_request__prepared_request(mock_session):
+ """The same should work for PreparedRequests with CachedSession.send()"""
+ mock_session.expire_after = None
+ request = Request(method='GET', url=MOCKED_URL, headers={}, data=None).prepare()
+ response = mock_session.send(request, expire_after=1)
+ assert response.from_cache is False
+ assert mock_session.send(request).from_cache is True
+
time.sleep(1)
response = mock_session.get(MOCKED_URL)
assert response.from_cache is False