diff options
author | Chayim <chayim@users.noreply.github.com> | 2023-03-15 11:35:20 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-15 11:35:20 +0200 |
commit | 5588ae08b3138c700726a9bf145ac34bc812ebcc (patch) | |
tree | 5c5fb5ed874e6483c18579a25067de3665d1ab88 /redis/asyncio/connection.py | |
parent | b546a9a81c374b054835a5eeda9b580344d78dfd (diff) | |
download | redis-py-5588ae08b3138c700726a9bf145ac34bc812ebcc.tar.gz |
Speeding up the protocol parsing (#2596)
* speeding up the protocol parser
* linting
* changes to ease
Diffstat (limited to 'redis/asyncio/connection.py')
-rw-r--r-- | redis/asyncio/connection.py | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/redis/asyncio/connection.py b/redis/asyncio/connection.py index e77fba3..056998e 100644 --- a/redis/asyncio/connection.py +++ b/redis/asyncio/connection.py @@ -267,9 +267,6 @@ class PythonParser(BaseParser): response: Any byte, response = raw[:1], raw[1:] - if byte not in (b"-", b"+", b":", b"$", b"*"): - raise InvalidResponse(f"Protocol Error: {raw!r}") - # server returned an error if byte == b"-": response = response.decode("utf-8", errors="replace") @@ -289,22 +286,24 @@ class PythonParser(BaseParser): pass # int value elif byte == b":": - response = int(response) + return int(response) # bulk response + elif byte == b"$" and response == b"-1": + return None elif byte == b"$": - length = int(response) - if length == -1: - return None - response = await self._read(length) + response = await self._read(int(response)) # multi-bulk response + elif byte == b"*" and response == b"-1": + return None elif byte == b"*": - length = int(response) - if length == -1: - return None response = [ - (await self._read_response(disable_decoding)) for _ in range(length) + (await self._read_response(disable_decoding)) + for _ in range(int(response)) # noqa ] - if isinstance(response, bytes) and disable_decoding is False: + else: + raise InvalidResponse(f"Protocol Error: {raw!r}") + + if disable_decoding is False: response = self.encoder.decode(response) return response |