diff options
| author | Jordan Cook <jordan.cook@pioneer.com> | 2021-08-25 15:31:05 -0500 |
|---|---|---|
| committer | Jordan Cook <jordan.cook@pioneer.com> | 2021-08-25 17:43:02 -0500 |
| commit | 20af95ca001110cf8df7d732526a3492cceba19f (patch) | |
| tree | 9ca505caa6f8a5e48b7e863b0ea25f419854e67c /requests_cache/models | |
| parent | 99282ad0d6df1444e43177cdac07e4af64ca2c84 (diff) | |
| download | requests-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.py | 10 | ||||
| -rwxr-xr-x | requests_cache/models/response.py | 15 |
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): |
