importhttpxfromhishelimportResponsefromhishel._async_httpximport(_httpx_to_internal,_internal_to_httpx,)fromhishel.httpximportAsyncCacheTransportasHishelAsyncCacheTransportfromharpimportget_loggerfromharp.utils.bytesimportensure_bytesfromharp_apps.http_cache.modelsimportWrappedRequestlogger=get_logger(__name__)def_rewrite_request_url(request:httpx.Request)->str:# We change the internal request url to use a host containing our proxy name, to avoid multiple cache for load balanced endpoints.endpoint_name=request.extensions.get("harp",{}).get("endpoint","__upstream__")returnstr(request.url.copy_with(netloc=ensure_bytes(endpoint_name),host=endpoint_name))
[docs]asyncdefhandle_async_request(self,request:httpx.Request)->httpx.Response:"""Wraps the request to use a rewritten url (for cache key handling)."""internal_request=_httpx_to_internal(request)url=_rewrite_request_url(request)logger.debug(f"Handling async request with rewritten URL for caching: original_url={request.url}, rewritten_url={url}")internal_response=awaitself._cache_proxy.handle_request(WrappedRequest(internal_request,url=url))return_internal_to_httpx(internal_response)
[docs]asyncdefrequest_sender(self,request:WrappedRequest)->Response:"""Unwraps the request before sending it."""returnawaitsuper().request_sender(request.unwrap())