diff options
author | Jordan Cook <jordan.cook.git@proton.me> | 2023-03-30 19:15:30 -0500 |
---|---|---|
committer | Jordan Cook <jordan.cook.git@proton.me> | 2023-04-02 21:42:25 -0500 |
commit | d20f445419529ea0fb5d8c6e851cd7d4cc56f65f (patch) | |
tree | 5fb8a42f432cc403069de7ce170ab25881288acf | |
parent | a137fd6b8a8622b6652948ef9567acd080c5dd43 (diff) | |
download | requests-cache-d20f445419529ea0fb5d8c6e851cd7d4cc56f65f.tar.gz |
Don't normalize CachedResponse.url when redacting ignored params
-rw-r--r-- | HISTORY.md | 3 | ||||
-rw-r--r-- | requests_cache/cache_keys.py | 32 | ||||
-rw-r--r-- | tests/unit/test_cache_keys.py | 22 |
3 files changed, 41 insertions, 16 deletions
@@ -3,6 +3,9 @@ ## Unreleased * Add support for regular expressions when using `urls_expire_after` +## 1.0.2 (2023-TBD) +* Revert normalizing `CachedResponse.url` so it matches the original request URL + ## 1.0.1 (2023-03-24) * Ignore `Cache-Control: must-revalidate` and `no-cache` response headers with `cache_control=False` diff --git a/requests_cache/cache_keys.py b/requests_cache/cache_keys.py index fa60619..a724ed5 100644 --- a/requests_cache/cache_keys.py +++ b/requests_cache/cache_keys.py @@ -142,19 +142,7 @@ def normalize_url(url: str, ignored_parameters: ParamList) -> str: """Normalize and filter a URL. This includes request parameters, IDN domains, scheme, host, port, etc. """ - # Strip query params from URL, sort and filter, and reassemble into a complete URL - url_tokens = urlparse(url) - url = urlunparse( - ( - url_tokens.scheme, - url_tokens.netloc, - url_tokens.path, - url_tokens.params, - normalize_params(url_tokens.query, ignored_parameters), - url_tokens.fragment, - ) - ) - + url = filter_url(url, ignored_parameters) return url_normalize(url) @@ -210,7 +198,7 @@ def normalize_params(value: Union[str, bytes], ignored_parameters: ParamList = N def redact_response(response: CachedResponse, ignored_parameters: ParamList) -> CachedResponse: """Redact any ignored parameters (potentially containing sensitive info) from a cached request""" if ignored_parameters: - response.url = normalize_url(response.url, ignored_parameters) + response.url = filter_url(response.url, ignored_parameters) response.request = normalize_request(response.request, ignored_parameters) # type: ignore return response @@ -240,3 +228,19 @@ def filter_sort_list(data: List, ignored_parameters: ParamList = None) -> List: if not ignored_parameters: return sorted(data) return [k for k in sorted(data) if k not in set(ignored_parameters)] + + +def filter_url(url: str, ignored_parameters: ParamList) -> str: + """Filter ignored parameters out of a URL""" + # Strip query params from URL, sort and filter, and reassemble into a complete URL + url_tokens = urlparse(url) + return urlunparse( + ( + url_tokens.scheme, + url_tokens.netloc, + url_tokens.path, + url_tokens.params, + normalize_params(url_tokens.query, ignored_parameters), + url_tokens.fragment, + ) + ) diff --git a/tests/unit/test_cache_keys.py b/tests/unit/test_cache_keys.py index 40cca7f..3e2f243 100644 --- a/tests/unit/test_cache_keys.py +++ b/tests/unit/test_cache_keys.py @@ -4,9 +4,14 @@ This just contains tests for some extra edge cases not covered elsewhere. import json import pytest -from requests import Request +from requests import Request, Response -from requests_cache.cache_keys import MAX_NORM_BODY_SIZE, create_key, normalize_request +from requests_cache.cache_keys import ( + MAX_NORM_BODY_SIZE, + create_key, + normalize_request, + redact_response, +) CACHE_KEY = 'e25f7e6326966e82' @@ -61,6 +66,19 @@ def test_create_key__normalize_duplicate_params(): assert create_key(request_1) == create_key(request_2) +def test_redact_response__escaped_params(): + """Test that redact_response() handles escaped request parameters""" + request = Request( + method='GET', + url='https://img.site.com/base/img.jpg?ignored_param=value_1¶m_2=value_2', + ) + response = Response() + response.url = 'https://img.site.com/base/img.jpg?where=code%3D123' + response.request = request + redacted_response = redact_response(response, []) + assert redacted_response.url == 'https://img.site.com/base/img.jpg?where=code%3D123' + + def test_normalize_request__json_body(): request = Request( method='GET', |