diff --git a/src/calibre/srv/tests/web_sockets.py b/src/calibre/srv/tests/web_sockets.py index ad361de217..1d8ea22ebd 100644 --- a/src/calibre/srv/tests/web_sockets.py +++ b/src/calibre/srv/tests/web_sockets.py @@ -251,9 +251,16 @@ class WebSocketTest(BaseTest): {'opcode':opcode, 'payload':'f1', 'fin':0}, {'opcode':opcode, 'payload':'f2'} ], close_code=PROTOCOL_ERROR, send_close=False) + client = server.connect() + self.simple_test(client, [{'opcode':0, 'payload':b'non-continuation frame'}, 'some text'], close_code=PROTOCOL_ERROR, send_close=False) + fragments = 'frag1 frag2'.split() client = server.connect() self.simple_test(client, [ {'opcode':TEXT, 'payload':fragments[0], 'fin':0}, {'opcode':TEXT, 'payload':fragments[1]} ], [''.join(fragments)]) + client = server.connect() + self.simple_test(client, [ + {'opcode':TEXT, 'payload':fragments[0], 'fin':0}, (PING, b'pong'), {'opcode':TEXT, 'payload':fragments[1]} + ], [(PONG, b'pong'), ''.join(fragments)]) diff --git a/src/calibre/srv/web_socket.py b/src/calibre/srv/web_socket.py index b6d8f30f23..4f2bc6638d 100644 --- a/src/calibre/srv/web_socket.py +++ b/src/calibre/srv/web_socket.py @@ -316,6 +316,10 @@ class WebSocketConnection(HTTPConnection): message_starting = self.current_recv_opcode is None if message_starting: + if opcode == CONTINUATION: + self.log.error('Client sent continuation frame with no message to continue') + self.websocket_close(PROTOCOL_ERROR, 'Continuation frame without any message to continue') + return self.current_recv_opcode = opcode message_finished = frame_finished and is_final_frame_of_message if message_finished: