Skip to content

Commit 5588ae0

Browse files
authored
Speeding up the protocol parsing (#2596)
* speeding up the protocol parser * linting * changes to ease
1 parent b546a9a commit 5588ae0

File tree

2 files changed

+23
-26
lines changed

2 files changed

+23
-26
lines changed

redis/asyncio/connection.py

+12-13
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,6 @@ async def _read_response(
267267
response: Any
268268
byte, response = raw[:1], raw[1:]
269269

270-
if byte not in (b"-", b"+", b":", b"$", b"*"):
271-
raise InvalidResponse(f"Protocol Error: {raw!r}")
272-
273270
# server returned an error
274271
if byte == b"-":
275272
response = response.decode("utf-8", errors="replace")
@@ -289,22 +286,24 @@ async def _read_response(
289286
pass
290287
# int value
291288
elif byte == b":":
292-
response = int(response)
289+
return int(response)
293290
# bulk response
291+
elif byte == b"$" and response == b"-1":
292+
return None
294293
elif byte == b"$":
295-
length = int(response)
296-
if length == -1:
297-
return None
298-
response = await self._read(length)
294+
response = await self._read(int(response))
299295
# multi-bulk response
296+
elif byte == b"*" and response == b"-1":
297+
return None
300298
elif byte == b"*":
301-
length = int(response)
302-
if length == -1:
303-
return None
304299
response = [
305-
(await self._read_response(disable_decoding)) for _ in range(length)
300+
(await self._read_response(disable_decoding))
301+
for _ in range(int(response)) # noqa
306302
]
307-
if isinstance(response, bytes) and disable_decoding is False:
303+
else:
304+
raise InvalidResponse(f"Protocol Error: {raw!r}")
305+
306+
if disable_decoding is False:
308307
response = self.encoder.decode(response)
309308
return response
310309

redis/connection.py

+11-13
Original file line numberDiff line numberDiff line change
@@ -358,9 +358,6 @@ def _read_response(self, disable_decoding=False):
358358

359359
byte, response = raw[:1], raw[1:]
360360

361-
if byte not in (b"-", b"+", b":", b"$", b"*"):
362-
raise InvalidResponse(f"Protocol Error: {raw!r}")
363-
364361
# server returned an error
365362
if byte == b"-":
366363
response = response.decode("utf-8", errors="replace")
@@ -379,23 +376,24 @@ def _read_response(self, disable_decoding=False):
379376
pass
380377
# int value
381378
elif byte == b":":
382-
response = int(response)
379+
return int(response)
383380
# bulk response
381+
elif byte == b"$" and response == b"-1":
382+
return None
384383
elif byte == b"$":
385-
length = int(response)
386-
if length == -1:
387-
return None
388-
response = self._buffer.read(length)
384+
response = self._buffer.read(int(response))
389385
# multi-bulk response
386+
elif byte == b"*" and response == b"-1":
387+
return None
390388
elif byte == b"*":
391-
length = int(response)
392-
if length == -1:
393-
return None
394389
response = [
395390
self._read_response(disable_decoding=disable_decoding)
396-
for i in range(length)
391+
for i in range(int(response))
397392
]
398-
if isinstance(response, bytes) and disable_decoding is False:
393+
else:
394+
raise InvalidResponse(f"Protocol Error: {raw!r}")
395+
396+
if disable_decoding is False:
399397
response = self.encoder.decode(response)
400398
return response
401399

0 commit comments

Comments
 (0)