diff options
author | liris <liris.pp@gmail.com> | 2015-03-25 09:45:43 +0900 |
---|---|---|
committer | liris <liris.pp@gmail.com> | 2015-03-25 09:45:43 +0900 |
commit | 46f9266e6d0cc2b45c6ace3301d009f92212a6cb (patch) | |
tree | 9a44a29c0c423728db2e65cf3d58a254b42690bd /websocket/_abnf.py | |
parent | ba0f040fd15b13323e7e923ad9d699b7a9158fc1 (diff) | |
download | websocket-client-46f9266e6d0cc2b45c6ace3301d009f92212a6cb.tar.gz |
refactoring. continuous status is packed into frame_buffer
Diffstat (limited to 'websocket/_abnf.py')
-rw-r--r-- | websocket/_abnf.py | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/websocket/_abnf.py b/websocket/_abnf.py index 9242337..554cefc 100644 --- a/websocket/_abnf.py +++ b/websocket/_abnf.py @@ -222,11 +222,15 @@ class ABNF(object): return _d.tostring() -class FrameBuffer(object): +class frame_buffer(object): _HEADER_MASK_INDEX = 5 _HEADER_LENGHT_INDEX = 6 - def __init__(self): + def __init__(self, recv_fn): + self.recv = recv_fn + # Buffers over the packets from the layer beneath until desired amount + # bytes of bytes are received. + self.recv_buffer = [] self.clear() def clear(self): @@ -237,8 +241,8 @@ class FrameBuffer(object): def has_received_header(self): return self.header is None - def recv_header(self, recv_fn): - header = recv_fn(2) + def recv_header(self): + header = self.recv_strict(2) b1 = header[0] if six.PY2: @@ -262,20 +266,20 @@ class FrameBuffer(object): def has_mask(self): if not self.header: return False - return self.header[FrameBuffer._HEADER_MASK_INDEX] + return self.header[frame_buffer._HEADER_MASK_INDEX] def has_received_length(self): return self.length is None - def recv_length(self, recv_fn): - bits = self.header[FrameBuffer._HEADER_LENGHT_INDEX] + def recv_length(self): + bits = self.header[frame_buffer._HEADER_LENGHT_INDEX] length_bits = bits & 0x7f if length_bits == 0x7e: - v = recv_fn(2) + v = self.recv_strict(2) self.length = struct.unpack("!H", v)[0] elif length_bits == 0x7f: - v = recv_fn(8) + v = self.recv_strict(8) self.length = struct.unpack("!Q", v)[0] else: self.length = length_bits @@ -283,5 +287,21 @@ class FrameBuffer(object): def has_received_mask(self): return self.mask is None - def recv_mask(self, recv_fn): - self.mask = recv_fn(4) if self.has_mask() else "" + def recv_mask(self): + self.mask = self.recv_strict(4) if self.has_mask() else "" + + def recv_strict(self, bufsize): + shortage = bufsize - sum(len(x) for x in self.recv_buffer) + while shortage > 0: + bytes = self.recv(shortage) + self.recv_buffer.append(bytes) + shortage -= len(bytes) + + unified = six.b("").join(self.recv_buffer) + + if shortage == 0: + self.recv_buffer = [] + return unified + else: + self.recv_buffer = [unified[bufsize:]] + return unified[:bufsize] |