Улучшена обработка кешированных ответов
All checks were successful
Verify Dev Build / publish (push) Successful in 58s
All checks were successful
Verify Dev Build / publish (push) Successful in 58s
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
[project]
|
||||
name = "OxideHTTP"
|
||||
version = "1.4.0"
|
||||
version = "1.4.1"
|
||||
description = "High-performance Python HTTP client."
|
||||
readme = "README.md"
|
||||
authors = [{ name = "Miwory", email = "miwory.uwu@gmail.com" }]
|
||||
|
||||
@ -40,11 +40,7 @@ class OxideHTTP:
|
||||
self.__ready_event = Event()
|
||||
self.__ready_event.set()
|
||||
|
||||
self.__redis_client = (
|
||||
Redis.from_url(redis_url, decode_responses=True)
|
||||
if redis_url
|
||||
else None
|
||||
)
|
||||
self.__redis_client = Redis.from_url(redis_url) if redis_url else None
|
||||
self.__ratelimit_key = (
|
||||
f'oxide:ratelimit:{ratelimit_key}'
|
||||
if (redis_url and ratelimit_key)
|
||||
@ -86,13 +82,17 @@ class OxideHTTP:
|
||||
|
||||
return f'oxidehttp:cache:{digest}'
|
||||
|
||||
def __deserialize_response(self, data: str) -> s.CachedResponse:
|
||||
response_data = loads(data)
|
||||
def __deserialize_response(self, data: bytes) -> s.CachedResponse:
|
||||
view = memoryview(data)
|
||||
meta_len = int.from_bytes(view[:4], 'big')
|
||||
meta_json = view[4 : 4 + meta_len]
|
||||
body_bytes = view[4 + meta_len :]
|
||||
metadata = loads(meta_json)
|
||||
|
||||
return s.CachedResponse(
|
||||
status_code=response_data['status_code'],
|
||||
headers=response_data['headers'],
|
||||
data=response_data['data'],
|
||||
status_code=metadata['status'],
|
||||
headers=metadata['headers'],
|
||||
data=body_bytes.tobytes(),
|
||||
)
|
||||
|
||||
async def __get_cached_response(
|
||||
@ -107,14 +107,16 @@ class OxideHTTP:
|
||||
return self.__deserialize_response(cached_data)
|
||||
|
||||
async def __serialize_response(self, response: PyreqwestResponse) -> bytes:
|
||||
encoded_data = await response.bytes()
|
||||
data = {
|
||||
body = await response.bytes()
|
||||
metadata = {
|
||||
'status_code': response.status,
|
||||
'headers': dict(response.headers),
|
||||
'data': encoded_data.to_bytes().decode(),
|
||||
}
|
||||
|
||||
return dumps(data)
|
||||
meta_bytes = dumps(metadata)
|
||||
meta_len = len(meta_bytes).to_bytes(4, 'big')
|
||||
|
||||
return meta_len + meta_bytes + body
|
||||
|
||||
async def __get_wait_time(self) -> float:
|
||||
if not (
|
||||
|
||||
@ -29,7 +29,7 @@ class Response:
|
||||
return await self.pyreqwest_response.json()
|
||||
|
||||
|
||||
@dataclass
|
||||
@dataclass(slots=True)
|
||||
class CachedResponse:
|
||||
status_code: int
|
||||
headers: dict[str, str]
|
||||
@ -39,7 +39,7 @@ class CachedResponse:
|
||||
return memoryview(self.data)
|
||||
|
||||
async def text(self) -> str:
|
||||
return self.data.decode()
|
||||
return self.data.decode('utf-8', errors='replace')
|
||||
|
||||
async def json(self) -> dict[Any, Any]:
|
||||
return loads(self.data)
|
||||
|
||||
Reference in New Issue
Block a user