Улучшена обработка кешированных ответов
All checks were successful
Verify Dev Build / publish (push) Successful in 58s

This commit is contained in:
2026-04-24 17:58:36 +03:00
parent 7c4ee90340
commit fb6ee53357
3 changed files with 19 additions and 17 deletions

View File

@ -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" }]

View File

@ -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 (

View File

@ -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)