From fb6ee533576cff94bcf69d246b75c5e71e2c8764 Mon Sep 17 00:00:00 2001 From: Miwory Date: Fri, 24 Apr 2026 17:58:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=B5=D1=88=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BE=D1=82=D0=B2=D0=B5=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- src/oxidehttp/client.py | 30 ++++++++++++++++-------------- src/oxidehttp/schema.py | 4 ++-- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 45d3e0d..e7bc359 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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" }] diff --git a/src/oxidehttp/client.py b/src/oxidehttp/client.py index 16c4b02..8878e3f 100644 --- a/src/oxidehttp/client.py +++ b/src/oxidehttp/client.py @@ -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 ( diff --git a/src/oxidehttp/schema.py b/src/oxidehttp/schema.py index f880abc..f0716e6 100644 --- a/src/oxidehttp/schema.py +++ b/src/oxidehttp/schema.py @@ -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)