summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook.git@proton.me>2023-03-30 17:29:24 -0700
committerJordan Cook <jordan.cook.git@proton.me>2023-04-02 21:42:25 -0500
commit257387438bf0aef5bd3602802bce5faa94f65f0b (patch)
tree5fb8a42f432cc403069de7ce170ab25881288acf
parenta137fd6b8a8622b6652948ef9567acd080c5dd43 (diff)
parentd20f445419529ea0fb5d8c6e851cd7d4cc56f65f (diff)
downloadrequests-cache-257387438bf0aef5bd3602802bce5faa94f65f0b.tar.gz
Merge pull request #810 from requests-cache/quote-cached-params
Don't normalize CachedResponse.url when redacting ignored params
-rw-r--r--HISTORY.md3
-rw-r--r--requests_cache/cache_keys.py32
-rw-r--r--tests/unit/test_cache_keys.py22
3 files changed, 41 insertions, 16 deletions
diff --git a/HISTORY.md b/HISTORY.md
index 1b4ce20..968a957 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -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&param_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',