Skip to content

Commit

Permalink
Fix typo
Browse files Browse the repository at this point in the history
  • Loading branch information
Neil Booth committed Jun 10, 2018
1 parent e6d79dd commit f56be5c
Showing 1 changed file with 55 additions and 0 deletions.
55 changes: 55 additions & 0 deletions aiorpcx/framing.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
__all__ = ('FramerBase', 'NewlineFramer')

from itertools import chain
from collections import namedtuple
import struct


class FramerBase(object):
Expand Down Expand Up @@ -97,3 +99,56 @@ def messages(self, data):
self.synchronizing = True
raise MemoryError(f'dropping message over {self.max_size} '
' and re-synchronizing')


BinaryMessage = namedtuple("BinaryMessage", "command payload")
le32 = struct.Struct('<I')
to_le32 = le32.pack
from_le32 = le32.unpack


class BinaryFramer(FramerBase):

def __init__(self, magic, cmd_len, checksum, checksum_len):
self.magic = magic
self.cmd_len = cmd_len
self.checksum = checksum
self.checksum_len = checksum_len
self.parts = []
self.synchronizing = False

def frame(self, messages):
'''Return bytes formed by framing each message in messages,
an iterable, and concatenating the result.
'''
return b''.join(self.frame_message(msg) for msg in messages)

def frame_message(self, message):
return b''.join([
self.magic,
message.command.ljust(self.cmd_len, b'\0'),
to_le32(len(command.payload)),
self.checksum(command.payload),
command.payload
])

def messages(self, data):
'''A generator that yields messages for the caller to process.
Raises a MemoryError Exception if the internal buffer
overflows, so converting to a list before processing risks
message loss.
'''
assert isinstance(data, (bytes, bytearray))
len_offset = len(self.magic) + self.cmd_len
min_len = len_offset + 4 + self.checksum_len
parts = self.parts
parts.append(data)
parts_len = sum(len(part) for part in parts)
if len(parts[0]) < min_len:
self.parts = [b''.join(parts)]
if len(parts[0]) < min_len:
return
min_len += to_le32(parts[len_offset:len_offset + 4])
if parts_len < min_len:
return

0 comments on commit f56be5c

Please sign in to comment.