| 24 | |
| 25 | |
| 26 | class CacheControlAdapter(HTTPAdapter): |
| 27 | invalidating_methods = {"PUT", "PATCH", "DELETE"} |
| 28 | |
| 29 | def __init__( |
| 30 | self, |
| 31 | cache: BaseCache | None = None, |
| 32 | cache_etags: bool = True, |
| 33 | controller_class: type[CacheController] | None = None, |
| 34 | serializer: Serializer | None = None, |
| 35 | heuristic: BaseHeuristic | None = None, |
| 36 | cacheable_methods: Collection[str] | None = None, |
| 37 | *args: Any, |
| 38 | **kw: Any, |
| 39 | ) -> None: |
| 40 | super().__init__(*args, **kw) |
| 41 | self.cache = DictCache() if cache is None else cache |
| 42 | self.heuristic = heuristic |
| 43 | self.cacheable_methods = cacheable_methods or ("GET",) |
| 44 | |
| 45 | controller_factory = controller_class or CacheController |
| 46 | self.controller = controller_factory( |
| 47 | self.cache, cache_etags=cache_etags, serializer=serializer |
| 48 | ) |
| 49 | |
| 50 | def send( |
| 51 | self, |
| 52 | request: PreparedRequest, |
| 53 | stream: bool = False, |
| 54 | timeout: None | float | tuple[float, float] | tuple[float, None] = None, |
| 55 | verify: bool | str = True, |
| 56 | cert: (None | bytes | str | tuple[bytes | str, bytes | str]) = None, |
| 57 | proxies: Mapping[str, str] | None = None, |
| 58 | cacheable_methods: Collection[str] | None = None, |
| 59 | ) -> Response: |
| 60 | """ |
| 61 | Send a request. Use the request information to see if it |
| 62 | exists in the cache and cache the response if we need to and can. |
| 63 | """ |
| 64 | cacheable = cacheable_methods or self.cacheable_methods |
| 65 | if request.method in cacheable: |
| 66 | try: |
| 67 | cached_response = self.controller.cached_request(request) |
| 68 | except zlib.error: |
| 69 | cached_response = None |
| 70 | if cached_response: |
| 71 | return self.build_response(request, cached_response, from_cache=True) |
| 72 | |
| 73 | # check for etags and add headers if appropriate |
| 74 | request.headers.update(self.controller.conditional_headers(request)) |
| 75 | |
| 76 | resp = super().send(request, stream, timeout, verify, cert, proxies) |
| 77 | |
| 78 | return resp |
| 79 | |
| 80 | def build_response( # type: ignore[override] |
| 81 | self, |
| 82 | request: PreparedRequest, |
| 83 | response: HTTPResponse, |
no outgoing calls
searching dependent graphs…