summaryrefslogtreecommitdiff
path: root/requests_cache/models
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook@pioneer.com>2021-08-25 15:31:05 -0500
committerJordan Cook <jordan.cook@pioneer.com>2021-08-25 17:43:02 -0500
commit20af95ca001110cf8df7d732526a3492cceba19f (patch)
tree9ca505caa6f8a5e48b7e863b0ea25f419854e67c /requests_cache/models
parent99282ad0d6df1444e43177cdac07e4af64ca2c84 (diff)
downloadrequests-cache-20af95ca001110cf8df7d732526a3492cceba19f.tar.gz
Minor optimization: exclude redundant CachedResponse.cache_key and CachedHTTPResponse.headers from serialization, and set at runtime instead
Diffstat (limited to 'requests_cache/models')
-rw-r--r--requests_cache/models/raw_response.py10
-rwxr-xr-xrequests_cache/models/response.py15
2 files changed, 16 insertions, 9 deletions
diff --git a/requests_cache/models/raw_response.py b/requests_cache/models/raw_response.py
index 8275100..de2a8f6 100644
--- a/requests_cache/models/raw_response.py
+++ b/requests_cache/models/raw_response.py
@@ -1,5 +1,6 @@
from io import BytesIO
from logging import getLogger
+from typing import Mapping
from attr import define, field, fields_dict
from requests import Response
@@ -18,18 +19,20 @@ class CachedHTTPResponse(HTTPResponse):
"""
decode_content: bool = field(default=None)
- headers: HTTPHeaderDict = field(factory=dict)
+ headers: HTTPHeaderDict = None # Not serialized; set in either init or CachedResponse post-init
reason: str = field(default=None)
request_url: str = field(default=None)
status: int = field(default=0)
strict: int = field(default=0)
version: int = field(default=0)
- def __init__(self, *args, body: bytes = None, **kwargs):
+ def __init__(self, *args, body: bytes = None, headers: Mapping = None, **kwargs):
"""First initialize via HTTPResponse, then via attrs"""
kwargs = {k: v for k, v in kwargs.items() if v is not None}
super().__init__(body=BytesIO(body or b''), preload_content=False, **kwargs)
+
self._body = body
+ self.headers = HTTPHeaderDict(headers)
self.__attrs_init__(*args, **kwargs)
@classmethod
@@ -37,7 +40,8 @@ class CachedHTTPResponse(HTTPResponse):
"""Create a CachedHTTPResponse based on an original response"""
# Copy basic attributes
raw = original_response.raw
- kwargs = {k: getattr(raw, k, None) for k in fields_dict(cls).keys()}
+ copy_attrs = list(fields_dict(cls).keys()) + ['headers']
+ kwargs = {k: getattr(raw, k, None) for k in copy_attrs}
# Note: _request_url is not available in urllib <=1.21
kwargs['request_url'] = getattr(raw, '_request_url', None)
diff --git a/requests_cache/models/response.py b/requests_cache/models/response.py
index 229fd6a..d7fa3df 100755
--- a/requests_cache/models/response.py
+++ b/requests_cache/models/response.py
@@ -6,6 +6,7 @@ from attr import define, field
from requests import PreparedRequest, Response
from requests.cookies import RequestsCookieJar
from requests.structures import CaseInsensitiveDict
+from urllib3.response import HTTPHeaderDict
from ..cache_control import ExpirationTime, get_expiration_datetime
from . import CachedHTTPResponse, CachedRequest
@@ -23,24 +24,26 @@ class CachedResponse(Response):
_content: bytes = field(default=None)
_next: Optional[CachedRequest] = field(default=None)
- url: str = field(default=None)
- status_code: int = field(default=0)
- cache_key: str = field(default=None)
+ cache_key: Optional[str] = None # Not serialized; set by BaseCache.get_response()
cookies: RequestsCookieJar = field(factory=RequestsCookieJar)
created_at: datetime = field(factory=datetime.utcnow)
elapsed: timedelta = field(factory=timedelta)
- expires: Optional[datetime] = field(default=None)
encoding: str = field(default=None)
- headers: CaseInsensitiveDict = field(factory=dict)
+ expires: Optional[datetime] = field(default=None)
+ headers: CaseInsensitiveDict = field(factory=CaseInsensitiveDict)
history: List['CachedResponse'] = field(factory=list) # type: ignore
+ raw: CachedHTTPResponse = field(factory=CachedHTTPResponse, repr=False)
reason: str = field(default=None)
request: CachedRequest = field(factory=CachedRequest) # type: ignore
- raw: CachedHTTPResponse = field(factory=CachedHTTPResponse, repr=False)
+ status_code: int = field(default=0)
+ url: str = field(default=None)
def __attrs_post_init__(self):
"""Re-initialize raw response body after deserialization"""
if self.raw._body is None and self._content is not None:
self.raw.reset(self._content)
+ if not self.raw.headers:
+ self.raw.headers = HTTPHeaderDict(self.headers)
@classmethod
def from_response(cls, original_response: Response, **kwargs):