- fixed #113
This commit is contained in:
@@ -352,6 +352,7 @@ class WebSocket(object):
|
|||||||
# These buffer over the build-up of a single frame.
|
# These buffer over the build-up of a single frame.
|
||||||
self._frame_buffer = _FrameBuffer()
|
self._frame_buffer = _FrameBuffer()
|
||||||
self._cont_data = None
|
self._cont_data = None
|
||||||
|
self._recving_frames = None
|
||||||
if enable_multithread:
|
if enable_multithread:
|
||||||
self.lock = threading.Lock()
|
self.lock = threading.Lock()
|
||||||
else:
|
else:
|
||||||
@@ -684,17 +685,24 @@ class WebSocket(object):
|
|||||||
# 'NoneType' object has no attribute 'opcode'
|
# 'NoneType' object has no attribute 'opcode'
|
||||||
raise WebSocketException("Not a valid frame %s" % frame)
|
raise WebSocketException("Not a valid frame %s" % frame)
|
||||||
elif frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY, ABNF.OPCODE_CONT):
|
elif frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY, ABNF.OPCODE_CONT):
|
||||||
if not self.fire_cont_frame and frame.opcode == ABNF.OPCODE_CONT and not self._cont_data:
|
if frame.opcode == ABNF.OPCODE_CONT and not self._recving_frames:
|
||||||
raise WebSocketException("Illegal frame")
|
raise WebSocketException("Illegal frame")
|
||||||
|
|
||||||
if self._cont_data:
|
if self._cont_data:
|
||||||
self._cont_data[1] += frame.data
|
self._cont_data[1] += frame.data
|
||||||
else:
|
else:
|
||||||
|
if frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY):
|
||||||
|
self._recving_frames = frame.opcode
|
||||||
self._cont_data = [frame.opcode, frame.data]
|
self._cont_data = [frame.opcode, frame.data]
|
||||||
|
|
||||||
|
if frame.fin:
|
||||||
|
self._recving_frames = None
|
||||||
|
|
||||||
if frame.fin or self.fire_cont_frame:
|
if frame.fin or self.fire_cont_frame:
|
||||||
data = self._cont_data
|
data = self._cont_data
|
||||||
self._cont_data = None
|
self._cont_data = None
|
||||||
return data
|
return data
|
||||||
|
|
||||||
elif frame.opcode == ABNF.OPCODE_CLOSE:
|
elif frame.opcode == ABNF.OPCODE_CLOSE:
|
||||||
self.send_close()
|
self.send_close()
|
||||||
return (frame.opcode, frame.data)
|
return (frame.opcode, frame.data)
|
||||||
|
@@ -294,8 +294,8 @@ class WebSocketTest(unittest.TestCase):
|
|||||||
s = sock.sock = SockMock()
|
s = sock.sock = SockMock()
|
||||||
# OPCODE=TEXT, FIN=0, MSG="Brevity is "
|
# OPCODE=TEXT, FIN=0, MSG="Brevity is "
|
||||||
s.add_packet(six.b("\x01\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
|
s.add_packet(six.b("\x01\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
|
||||||
# OPCODE=TEXT, FIN=0, MSG="Brevity is "
|
# OPCODE=CONT, FIN=0, MSG="Brevity is "
|
||||||
s.add_packet(six.b("\x01\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
|
s.add_packet(six.b("\x00\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
|
||||||
# OPCODE=CONT, FIN=1, MSG="the soul of wit"
|
# OPCODE=CONT, FIN=1, MSG="the soul of wit"
|
||||||
s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
|
s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
|
||||||
|
|
||||||
@@ -306,6 +306,11 @@ class WebSocketTest(unittest.TestCase):
|
|||||||
_, data = sock.recv_data()
|
_, data = sock.recv_data()
|
||||||
self.assertEqual(data, six.b("the soul of wit"))
|
self.assertEqual(data, six.b("the soul of wit"))
|
||||||
|
|
||||||
|
# OPCODE=CONT, FIN=0, MSG="Brevity is "
|
||||||
|
s.add_packet(six.b("\x80\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
|
||||||
|
|
||||||
|
with self.assertRaises(ws.WebSocketException):
|
||||||
|
sock.recv_data()
|
||||||
|
|
||||||
with self.assertRaises(ws.WebSocketConnectionClosedException):
|
with self.assertRaises(ws.WebSocketConnectionClosedException):
|
||||||
sock.recv()
|
sock.recv()
|
||||||
|
Reference in New Issue
Block a user