summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChayim <chayim@users.noreply.github.com>2023-03-15 11:35:20 +0200
committerGitHub <noreply@github.com>2023-03-15 11:35:20 +0200
commit5588ae08b3138c700726a9bf145ac34bc812ebcc (patch)
tree5c5fb5ed874e6483c18579a25067de3665d1ab88
parentb546a9a81c374b054835a5eeda9b580344d78dfd (diff)
downloadredis-py-5588ae08b3138c700726a9bf145ac34bc812ebcc.tar.gz
Speeding up the protocol parsing (#2596)
* speeding up the protocol parser * linting * changes to ease
-rw-r--r--redis/asyncio/connection.py25
-rw-r--r--redis/connection.py24
2 files changed, 23 insertions, 26 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
diff --git a/redis/connection.py b/redis/connection.py
index d35980c..c4a9685 100644
--- a/redis/connection.py
+++ b/redis/connection.py
@@ -358,9 +358,6 @@ class PythonParser(BaseParser):
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")
@@ -379,23 +376,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 = self._buffer.read(length)
+ response = self._buffer.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 = [
self._read_response(disable_decoding=disable_decoding)
- for i in range(length)
+ for i in range(int(response))
]
- 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