Esempio n. 1
0
    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)
Esempio n. 2
0
    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)
Esempio n. 3
0
    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'
Esempio n. 4
0
    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)
Esempio n. 5
0
    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'
Esempio n. 6
0
    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)
Esempio n. 7
0
 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)
Esempio n. 8
0
    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)