def test_compressed_send_recv_both_no_context_13(self): extensions_string = ( 'permessage-deflate;' ' server_no_context_takeover; client_no_context_takeover') extensions = { 'permessage-deflate': { 'client_no_context_takeover': True, 'server_no_context_takeover': True } } sock = eventlet.connect(self.server_addr) sock.sendall(six.b(self.connect % extensions_string)) sock.recv(1024) ws = websocket.RFC6455WebSocket(sock, {}, client=True, extensions=extensions) ws.send(b'hello') assert ws.wait() == b'hello' ws.send(b'hello world!') ws.send(u'hello world again!') assert ws.wait() == b'hello world!' assert ws.wait() == u'hello world again!' ws.close() eventlet.sleep(0.01)
def test_large_frame_size_compressed_13(self): # Test fix for GHSA-9p9m-jm8w-94p2 extensions_string = 'permessage-deflate' extensions = { 'permessage-deflate': { 'client_no_context_takeover': False, 'server_no_context_takeover': False } } sock = eventlet.connect(self.server_addr) sock.sendall(six.b(self.connect % extensions_string)) sock.recv(1024) ws = websocket.RFC6455WebSocket(sock, {}, client=True, extensions=extensions) should_still_fit = b"x" * TEST_MAX_FRAME_LENGTH one_too_much = should_still_fit + b"x" # send just fitting frame twice to make sure they are fine independently ws.send(should_still_fit) assert ws.wait() == should_still_fit ws.send(should_still_fit) assert ws.wait() == should_still_fit ws.send(one_too_much) res = ws.wait() assert res is None # socket closed # TODO: The websocket currently sents compressed control frames, which contradicts RFC7692. # Renable the following assert after that has been fixed. # assert ws._remote_close_data == b"\x03\xf1Incoming compressed frame is above length limit." eventlet.sleep(0.01)
def test_server_compress_no_context_takeover_13(self): extensions_string = 'permessage-deflate; server_no_context_takeover;' extensions = { 'permessage-deflate': { 'client_no_context_takeover': False, 'server_no_context_takeover': True } } sock = eventlet.connect(self.server_addr) sock.sendall(six.b(self.connect % extensions_string)) sock.recv(1024) ws = websocket.RFC6455WebSocket(sock, {}, client=True, extensions=extensions) masked_msg1 = ws._pack_message(b'Hello', masked=True) ws._send(masked_msg1) masked_msg2 = ws._pack_message(b'Hello', masked=True) ws._send(masked_msg2) # Verify that client uses context takeover by checking # that the second message assert len(masked_msg2) < len(masked_msg1) # Verify that server drops context between messages # Deflated values taken from Section 7.2.3 of RFC 7692 # https://tools.ietf.org/html/rfc7692#section-7.2.3 reply_msg1 = self.get_deflated_reply(ws) assert reply_msg1 == b'\xf2\x48\xcd\xc9\xc9\x07\x00' reply_msg2 = self.get_deflated_reply(ws) assert reply_msg2 == b'\xf2\x48\xcd\xc9\xc9\x07\x00'
def test_server_compress_with_context_takeover_13(self): extensions_string = 'permessage-deflate; client_no_context_takeover;' extensions = { 'permessage-deflate': { 'client_no_context_takeover': True, 'server_no_context_takeover': False } } sock = eventlet.connect(self.server_addr) sock.sendall(six.b(self.connect % extensions_string)) sock.recv(1024) ws = websocket.RFC6455WebSocket(sock, {}, client=True, extensions=extensions) # Deflated values taken from Section 7.2.3 of RFC 7692 # https://tools.ietf.org/html/rfc7692#section-7.2.3 ws.send(b'Hello') msg1 = self.get_deflated_reply(ws) assert msg1 == b'\xf2\x48\xcd\xc9\xc9\x07\x00' ws.send(b'Hello') msg2 = self.get_deflated_reply(ws) assert msg2 == b'\xf2\x00\x11\x00\x00' ws.close() eventlet.sleep(0.01)
def test_client_compress_no_context_takeover_13(self): extensions = { 'permessage-deflate': { 'client_no_context_takeover': True, 'server_no_context_takeover': False } } ws = websocket.RFC6455WebSocket(None, {}, client=True, extensions=extensions) # Deflated values taken from Section 7.2.3 of RFC 7692 # modified opcode to Binary instead of Text # https://tools.ietf.org/html/rfc7692#section-7.2.3 packed_msg_1 = ws._pack_message(b'Hello', masked=False) assert packed_msg_1 == b'\xc2\x07\xf2\x48\xcd\xc9\xc9\x07\x00' packed_msg_2 = ws._pack_message(b'Hello', masked=False) assert packed_msg_2 == b'\xc2\x07\xf2\x48\xcd\xc9\xc9\x07\x00'
def test_large_frame_size_uncompressed_13(self): # Test fix for GHSA-9p9m-jm8w-94p2 sock = eventlet.connect(self.server_addr) sock.sendall(six.b(self.connect)) sock.recv(1024) ws = websocket.RFC6455WebSocket(sock, {}, client=True) should_still_fit = b"x" * TEST_MAX_FRAME_LENGTH one_too_much = should_still_fit + b"x" # send just fitting frame twice to make sure they are fine independently ws.send(should_still_fit) assert ws.wait() == should_still_fit ws.send(should_still_fit) assert ws.wait() == should_still_fit ws.send(one_too_much) res = ws.wait() assert res is None # socket closed # close code should be available now assert ws._remote_close_data == b"\x03\xf1Incoming frame of 50001 bytes is above length limit of 50000 bytes." eventlet.sleep(0.01)
def test_send_recv_13(self): connect = [ "GET /echo HTTP/1.1", "Upgrade: websocket", "Connection: Upgrade", "Host: %s:%s" % self.server_addr, "Origin: http://%s:%s" % self.server_addr, "Sec-WebSocket-Version: 13", "Sec-WebSocket-Key: d9MXuOzlVQ0h+qRllvSCIg==", ] sock = eventlet.connect(self.server_addr) sock.sendall(six.b('\r\n'.join(connect) + '\r\n\r\n')) sock.recv(1024) ws = websocket.RFC6455WebSocket(sock, {}, client=True) ws.send(b'hello') assert ws.wait() == b'hello' ws.send(b'hello world!\x01') ws.send(u'hello world again!') assert ws.wait() == b'hello world!\x01' assert ws.wait() == u'hello world again!' ws.close() eventlet.sleep(0.01)
def test_send_uncompressed_msg_13(self): extensions_string = 'permessage-deflate' extensions = { 'permessage-deflate': { 'client_no_context_takeover': False, 'server_no_context_takeover': False } } sock = eventlet.connect(self.server_addr) sock.sendall(six.b(self.connect % extensions_string)) sock.recv(1024) # Send without using deflate, having rsv1 unset ws = websocket.RFC6455WebSocket(sock, {}, client=True) ws.send(b'Hello') # Adding extensions to recognise deflated response ws.extensions = extensions assert ws.wait() == b'Hello' ws.close() eventlet.sleep(0.01)