Skip to content

Commit e1af42e

Browse files
authored
Merge pull request #104 from JelleAalbers/fix_frame_concatenation
Faster message body retrieval
2 parents 4372e34 + eec83d2 commit e1af42e

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

rabbitpy/channel.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -465,9 +465,20 @@ def _wait_for_content_frames(self, method_frame):
465465
return self._on_interrupt_set()
466466

467467
error = False
468-
body_value = bytes() if PYTHON3 else str()
469-
while len(body_value) < header_value.body_size:
468+
469+
# To retrieve the message body we must concatenate the binary content
470+
# of several frames. The recommended idiom for this differs
471+
# in py3 and py2.
472+
if PYTHON3:
473+
body_value = bytearray()
474+
else:
475+
body_chunks = []
476+
body_length_received = 0
477+
body_total_size = header_value.body_size
478+
479+
while body_length_received < body_total_size:
470480
body_part = self._wait_on_frame(CONTENT_BODY)
481+
471482
self._check_for_rpc_request(body_part)
472483
if self._interrupt_is_set:
473484
self._on_interrupt_set()
@@ -479,12 +490,16 @@ def _wait_for_content_frames(self, method_frame):
479490
elif consuming and not self._consumers:
480491
self._reject_inbound_message(method_frame)
481492
error = True
482-
483493
if error:
484494
return
485495

486-
body_value += body_part.value
487-
if len(body_value) == header_value.body_size:
488-
break
496+
body_length_received += len(body_part.value)
497+
if PYTHON3:
498+
body_value += body_part.value
499+
else:
500+
body_chunks.append(body_part.value)
501+
502+
if not PYTHON3:
503+
body_value = ''.join(body_chunks)
489504

490505
return self._create_message(method_frame, header_value, body_value)

0 commit comments

Comments
 (0)