mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-08-11 09:13:57 -04:00
Fix decoding of fragment text messages
This commit is contained in:
parent
c37c2bf718
commit
2535953fc6
@ -228,7 +228,7 @@ class WebSocketTest(BaseTest):
|
|||||||
with WSTestServer(EchoHandler) as server:
|
with WSTestServer(EchoHandler) as server:
|
||||||
simple_test = partial(self.simple_test, server)
|
simple_test = partial(self.simple_test, server)
|
||||||
|
|
||||||
for q in ('', '*' * 125, '*' * 126, '*' * 127, '*' * 128, '*' * 65535, '*' * 65536):
|
for q in ('', '*' * 125, '*' * 126, '*' * 127, '*' * 128, '*' * 65535, '*' * 65536, "Hello-µ@ßöäüàá-UTF-8!!"):
|
||||||
simple_test([q], [q])
|
simple_test([q], [q])
|
||||||
for q in (b'', b'\xfe' * 125, b'\xfe' * 126, b'\xfe' * 127, b'\xfe' * 128, b'\xfe' * 65535, b'\xfe' * 65536):
|
for q in (b'', b'\xfe' * 125, b'\xfe' * 126, b'\xfe' * 127, b'\xfe' * 128, b'\xfe' * 65535, b'\xfe' * 65536):
|
||||||
simple_test([q], [q])
|
simple_test([q], [q])
|
||||||
@ -242,7 +242,7 @@ class WebSocketTest(BaseTest):
|
|||||||
for payload in (b'', b'pong'):
|
for payload in (b'', b'pong'):
|
||||||
simple_test([(PONG, payload)], [])
|
simple_test([(PONG, payload)], [])
|
||||||
|
|
||||||
fragments = 'frag1 frag2'.split()
|
fragments = 'Hello-µ@ßöä üàá-UTF-8!!'.split()
|
||||||
|
|
||||||
with server.silence_log:
|
with server.silence_log:
|
||||||
for rsv in xrange(1, 7):
|
for rsv in xrange(1, 7):
|
||||||
@ -287,3 +287,10 @@ class WebSocketTest(BaseTest):
|
|||||||
{'opcode':TEXT, 'fin':0}, {'opcode':CONTINUATION, 'fin':0}, {'opcode':CONTINUATION},], [''])
|
{'opcode':TEXT, 'fin':0}, {'opcode':CONTINUATION, 'fin':0}, {'opcode':CONTINUATION},], [''])
|
||||||
simple_test([
|
simple_test([
|
||||||
{'opcode':TEXT, 'fin':0}, {'opcode':CONTINUATION, 'fin':0, 'payload':'x'}, {'opcode':CONTINUATION},], ['x'])
|
{'opcode':TEXT, 'fin':0}, {'opcode':CONTINUATION, 'fin':0, 'payload':'x'}, {'opcode':CONTINUATION},], ['x'])
|
||||||
|
|
||||||
|
byte_data = "Hello-µ@ßöäüàá-UTF-8!!".encode('utf-8')
|
||||||
|
frags = []
|
||||||
|
for i, b in enumerate(byte_data):
|
||||||
|
frags.append({'opcode':(TEXT if i == 0 else CONTINUATION), 'fin':1 if i == len(byte_data)-1 else 0, 'payload':b})
|
||||||
|
simple_test(frags, [byte_data.decode('utf-8')])
|
||||||
|
|
||||||
|
@ -326,17 +326,17 @@ class WebSocketConnection(HTTPConnection):
|
|||||||
self.websocket_close(PROTOCOL_ERROR, 'Continuation frame with non-zero opcode')
|
self.websocket_close(PROTOCOL_ERROR, 'Continuation frame with non-zero opcode')
|
||||||
return
|
return
|
||||||
message_finished = frame_finished and is_final_frame_of_message
|
message_finished = frame_finished and is_final_frame_of_message
|
||||||
if message_finished:
|
if self.current_recv_opcode == TEXT:
|
||||||
self.current_recv_opcode = None
|
|
||||||
if opcode == TEXT:
|
|
||||||
if message_starting:
|
if message_starting:
|
||||||
self.frag_decoder.reset()
|
self.frag_decoder.reset()
|
||||||
try:
|
try:
|
||||||
data = self.frag_decoder.decode(data, final=message_finished)
|
data = self.frag_decoder.decode(data, final=message_finished)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
self.frag_decoder.reset()
|
self.frag_decoder.reset()
|
||||||
|
self.log.error('Client sent undecodeable UTF-8')
|
||||||
return self.websocket_close(INCONSISTENT_DATA, 'Not valid UTF-8')
|
return self.websocket_close(INCONSISTENT_DATA, 'Not valid UTF-8')
|
||||||
if message_finished:
|
if message_finished:
|
||||||
|
self.current_recv_opcode = None
|
||||||
self.frag_decoder.reset()
|
self.frag_decoder.reset()
|
||||||
try:
|
try:
|
||||||
self.handle_websocket_data(data, message_starting, message_finished)
|
self.handle_websocket_data(data, message_starting, message_finished)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user