summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatti Hanninen <mha@iki.fi>2013-08-20 07:17:47 +0300
committerMatti Hanninen <mha@iki.fi>2013-08-20 21:37:45 +0300
commitc9006e5c7f0588f64f4af582dad307ec339850f3 (patch)
tree7e80c0479ecfc0128c08d3e552003df62adf26bd
parent5df9e90038efa88f2aa7cda63d7eab4a69f4da6f (diff)
downloadwebsocket-client-c9006e5c7f0588f64f4af582dad307ec339850f3.tar.gz
Buffer packets from the lower layer during recv
-rw-r--r--websocket.py19
1 files changed, 13 insertions, 6 deletions
diff --git a/websocket.py b/websocket.py
index 6996949..ba54cc4 100644
--- a/websocket.py
+++ b/websocket.py
@@ -367,6 +367,7 @@ class WebSocket(object):
self.sock.setsockopt(*opts)
self.sslopt = sslopt
self.get_mask_key = get_mask_key
+ self._recv_buffer = []
def fileno(self):
return self.sock.fileno()
@@ -708,13 +709,19 @@ class WebSocket(object):
def _recv_strict(self, bufsize):
- remaining = bufsize
- bytes = ""
- while remaining:
- bytes += self._recv(remaining)
- remaining = bufsize - len(bytes)
+ 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 = "".join(self._recv_buffer)
+ if shortage == 0:
+ self._recv_buffer = []
+ return unified
+ else:
+ self._recv_buffer = [unified[bufsize:]]
+ return unified[:bufsize]
- return bytes
def _recv_line(self):
line = []