diff options
author | Jordan Cook <jordan.cook.git@proton.me> | 2023-05-08 12:27:21 -0500 |
---|---|---|
committer | Jordan Cook <jordan.cook.git@proton.me> | 2023-05-08 12:29:57 -0500 |
commit | 914b62502cf510a6c67b61453a67f90c86222f6e (patch) | |
tree | 9b664b13956cee79a6f018f6c763420c1359e815 /requests_cache | |
parent | e5d54b4f930956bbfdaf21d819e269a9857fc28a (diff) | |
download | requests-cache-914b62502cf510a6c67b61453a67f90c86222f6e.tar.gz |
Fix loading cached JSON content when decode_content=True and the root element is a list
Diffstat (limited to 'requests_cache')
-rwxr-xr-x | requests_cache/models/response.py | 2 | ||||
-rw-r--r-- | requests_cache/serializers/cattrs.py | 11 |
2 files changed, 9 insertions, 4 deletions
diff --git a/requests_cache/models/response.py b/requests_cache/models/response.py index 2cd6047..134d04b 100755 --- a/requests_cache/models/response.py +++ b/requests_cache/models/response.py @@ -18,7 +18,7 @@ if TYPE_CHECKING: from ..policy.actions import CacheActions DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S %Z' # Format used for __str__ only -DecodedContent = Union[Dict, str, None] +DecodedContent = Union[Dict, List, str, None] logger = getLogger(__name__) diff --git a/requests_cache/serializers/cattrs.py b/requests_cache/serializers/cattrs.py index bf45c2d..439463e 100644 --- a/requests_cache/serializers/cattrs.py +++ b/requests_cache/serializers/cattrs.py @@ -109,9 +109,12 @@ def init_converter( converter.register_structure_hook( CaseInsensitiveDict, lambda obj, cls: CaseInsensitiveDict(obj) ) - # Convert decoded JSON body back to string + + # Convert decoded JSON body back to a string. If the object is a valid JSON root (dict or list), + # that means it was previously saved in human-readable format due to `decode_content=True`. + # After this hook runs, the body will also be re-encoded with `_encode_content()`. converter.register_structure_hook( - DecodedContent, lambda obj, cls: json.dumps(obj) if isinstance(obj, dict) else obj + DecodedContent, lambda obj, cls: json.dumps(obj) if isinstance(obj, (dict, list)) else obj ) # Resolve forward references (required for CachedResponse.history) @@ -157,7 +160,9 @@ def _decode_content(response: CachedResponse, response_dict: Dict) -> Dict: def _encode_content(response: CachedResponse) -> CachedResponse: - """Re-encode response body if saved as JSON or text; has no effect for a binary response body""" + """Re-encode response body if saved as JSON or text (via ``decode_content=True``). + This has no effect for a binary response body. + """ if isinstance(response._decoded_content, str): response._content = response._decoded_content.encode('utf-8') response._decoded_content = None |