summaryrefslogtreecommitdiff
path: root/requests_cache
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook.git@proton.me>2022-09-29 11:47:49 -0500
committerJordan Cook <jordan.cook.git@proton.me>2022-09-29 12:05:13 -0500
commit5204d487fea1d0b89e9eecdbc4a38621d2d4dbe4 (patch)
tree5a7683e4cb01359a151742223c4d3a4301d75f50 /requests_cache
parent8af0552b3f1011b5c004d345da4d94e48a40e4fe (diff)
downloadrequests-cache-5204d487fea1d0b89e9eecdbc4a38621d2d4dbe4.tar.gz
Match whether ignored_parameters are present in a request (without matching content)
Diffstat (limited to 'requests_cache')
-rw-r--r--requests_cache/cache_keys.py21
1 files changed, 13 insertions, 8 deletions
diff --git a/requests_cache/cache_keys.py b/requests_cache/cache_keys.py
index 1aeed7a..fa60619 100644
--- a/requests_cache/cache_keys.py
+++ b/requests_cache/cache_keys.py
@@ -40,7 +40,7 @@ __all__ = [
if TYPE_CHECKING:
from .models import AnyPreparedRequest, AnyRequest, CachedResponse
-# Maximum JSON request body size that will be normalized
+# Maximum JSON request body size that will be filtered and normalized
MAX_NORM_BODY_SIZE = 10 * 1024 * 1024
KVList = List[Tuple[str, str]]
@@ -160,15 +160,16 @@ def normalize_url(url: str, ignored_parameters: ParamList) -> str:
def normalize_body(request: AnyPreparedRequest, ignored_parameters: ParamList) -> bytes:
"""Normalize and filter a request body if possible, depending on Content-Type"""
- original_body = request.body or b''
+ if not request.body:
+ return b''
content_type = request.headers.get('Content-Type')
# Filter and sort params if possible
- filtered_body: Union[str, bytes] = original_body
+ filtered_body: Union[str, bytes] = request.body
if content_type == 'application/json':
- filtered_body = normalize_json_body(original_body, ignored_parameters)
+ filtered_body = normalize_json_body(request.body, ignored_parameters)
elif content_type == 'application/x-www-form-urlencoded':
- filtered_body = normalize_params(original_body, ignored_parameters)
+ filtered_body = normalize_params(request.body, ignored_parameters)
return encode(filtered_body)
@@ -224,14 +225,18 @@ def filter_sort_json(data: Union[List, Mapping], ignored_parameters: ParamList):
def filter_sort_dict(
data: Mapping[str, str], ignored_parameters: ParamList = None
) -> Dict[str, str]:
- return {k: v for k, v in sorted(data.items()) if k not in set(ignored_parameters or [])}
+ # Note: Any ignored_parameters present will have their values replaced instead of removing the
+ # parameter, so the cache key will still match whether the parameter was present or not.
+ ignored_parameters = set(ignored_parameters or [])
+ return {k: ('REDACTED' if k in ignored_parameters else v) for k, v in sorted(data.items())}
def filter_sort_multidict(data: KVList, ignored_parameters: ParamList = None) -> KVList:
- return [(k, v) for k, v in sorted(data) if k not in set(ignored_parameters or [])]
+ ignored_parameters = set(ignored_parameters or [])
+ return [(k, 'REDACTED' if k in ignored_parameters else v) for k, v in sorted(data)]
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 or [])]
+ return [k for k in sorted(data) if k not in set(ignored_parameters)]