Пример #1
0
 def test_send_handshake(self):
     handshake = "Hi!"
     ws = WebSocket(self.socket, self.protocol, handshake_reply=handshake)
     self.assertEquals(ws._handshake_sent, False)
     ws.send_handshake()
     self.assertEquals(self.socket.sendall.call_count, 1)
     self.assertEquals(self.socket.sendall.call_args, ((handshake,), {}))
Пример #2
0
 def test_send_handshake(self):
     handshake = 'Hi!'
     ws = WebSocket(self.socket, self.protocol, handshake_reply=handshake)
     self.assertEquals(ws._handshake_sent, False)
     ws.send_handshake()
     self.assertEquals(self.socket.sendall.call_count, 1)
     self.assertEquals(self.socket.sendall.call_args, ((handshake,), {}))
Пример #3
0
    def test_closing_socket_by_client(self):
        self.socket.recv.return_value = "\xFF\x00"

        ws = WebSocket(self.socket, self.protocol)
        self.assertFalse(ws.closed)
        self.assertEquals(ws.wait(), None)
        self.assertTrue(ws.closed)

        self.assertEquals(self.socket.shutdown.call_count, 0)
        self.assertEquals(self.socket.close.call_count, 0)
Пример #4
0
    def test_closing_socket_by_client(self):
        self.socket.recv.return_value = '\xFF\x00'

        ws = WebSocket(self.socket, self.protocol)
        self.assertFalse(ws.closed)
        self.assertEquals(ws.wait(), None)
        self.assertTrue(ws.closed)

        self.assertEquals(self.socket.shutdown.call_count, 0)
        self.assertEquals(self.socket.close.call_count, 0)
Пример #5
0
    def test_message_receiving(self):
        ws = WebSocket(self.socket, self.protocol)
        self.assertFalse(ws.closed)

        results = ["\x00spam & eggs\xFF", "\x00K\xc3\xbcss die Hand sch\xc3\xb6ne Frau\xFF", "\xFF\x00"][::-1]

        def return_results(*args, **kwargs):
            return results.pop()

        self.socket.recv.side_effect = return_results
        self.assertEquals(ws.wait(), u"spam & eggs")
        self.assertEquals(ws.wait(), u"Küss die Hand schöne Frau")
Пример #6
0
    def test_message_sending(self):
        ws = WebSocket(self.socket, self.protocol)
        ws.send("foobar")
        self.assertEquals(self.socket.sendall.call_count, 1)
        self.assertEquals(self.socket.sendall.call_args, (("\x00foobar\xFF",), {}))
        message = self.socket.sendall.call_args[0][0]
        self.assertEquals(type(message), str)

        ws.send(u"Küss die Hand schöne Frau")
        self.assertEquals(self.socket.sendall.call_count, 2)
        self.assertEquals(self.socket.sendall.call_args, (("\x00K\xc3\xbcss die Hand sch\xc3\xb6ne Frau\xFF",), {}))
        message = self.socket.sendall.call_args[0][0]
        self.assertEquals(type(message), str)
Пример #7
0
    def test_message_receiving(self):
        ws = WebSocket(self.socket, self.protocol)
        self.assertFalse(ws.closed)

        results = [
            '\x00spam & eggs\xFF',
            '\x00K\xc3\xbcss die Hand sch\xc3\xb6ne Frau\xFF',
            '\xFF\x00'][::-1]
        def return_results(*args, **kwargs):
            return results.pop()
        self.socket.recv.side_effect = return_results
        self.assertEquals(ws.wait(), u'spam & eggs')
        self.assertEquals(ws.wait(), u'Küss die Hand schöne Frau')
Пример #8
0
    def test_closing_socket_by_server(self):
        ws = WebSocket(self.socket, self.protocol)
        self.assertFalse(ws.closed)
        ws.close()
        self.assertEquals(self.socket.sendall.call_count, 1)
        self.assertEquals(self.socket.sendall.call_args, (("\xFF\x00",), {}))
        # don't close system socket! django still needs it.
        self.assertEquals(self.socket.shutdown.call_count, 0)
        self.assertEquals(self.socket.close.call_count, 0)
        self.assertTrue(ws.closed)

        # closing again will not send another close message
        ws.close()
        self.assertTrue(ws.closed)
        self.assertEquals(self.socket.sendall.call_count, 1)
        self.assertEquals(self.socket.shutdown.call_count, 0)
        self.assertEquals(self.socket.close.call_count, 0)
Пример #9
0
def setup_websocket(request):
    if request.META.get('HTTP_CONNECTION', None) == 'Upgrade' and \
        request.META.get('HTTP_UPGRADE', None) == 'WebSocket':

        # See if they sent the new-format headers
        if 'HTTP_SEC_WEBSOCKET_KEY1' in request.META:
            protocol_version = 76
            if 'HTTP_SEC_WEBSOCKET_KEY2' not in request.META:
                raise MalformedWebSocket()
        else:
            protocol_version = 75

        # If it's new-version, we need to work out our challenge response
        if protocol_version == 76:
            key1 = _extract_number(request.META['HTTP_SEC_WEBSOCKET_KEY1'])
            key2 = _extract_number(request.META['HTTP_SEC_WEBSOCKET_KEY2'])
            # There's no content-length header in the request, but it has 8
            # bytes of data.
            key3 = request.META['wsgi.input'].read(8)
            key = struct.pack(">II", key1, key2) + key3
            handshake_response = md5(key).digest()

        location = 'ws://%s%s' % (request.get_host(), request.path)
        qs = request.META.get('QUERY_STRING')
        if qs:
            location += '?' + qs
        if protocol_version == 75:
            handshake_reply = ("HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
                               "Upgrade: WebSocket\r\n"
                               "Connection: Upgrade\r\n"
                               "WebSocket-Origin: %s\r\n"
                               "WebSocket-Location: %s\r\n\r\n" %
                               (request.META.get('HTTP_ORIGIN'), location))
        elif protocol_version == 76:
            handshake_reply = ("HTTP/1.1 101 Web Socket Protocol Handshake\r\n"
                               "Upgrade: WebSocket\r\n"
                               "Connection: Upgrade\r\n"
                               "Sec-WebSocket-Origin: %s\r\n"
                               "Sec-WebSocket-Protocol: %s\r\n"
                               "Sec-WebSocket-Location: %s\r\n" %
                               (request.META.get('HTTP_ORIGIN'),
                                request.META.get('HTTP_SEC_WEBSOCKET_PROTOCOL',
                                                 'default'), location))
            handshake_reply = str(handshake_reply)
            handshake_reply = '%s\r\n%s' % (handshake_reply,
                                            handshake_response)

        else:
            raise MalformedWebSocket("Unknown WebSocket protocol version.")
        socket = request.META['wsgi.input']._sock.dup()
        return WebSocket(
            socket,
            protocol=request.META.get('HTTP_WEBSOCKET_PROTOCOL'),
            version=protocol_version,
            handshake_reply=handshake_reply,
        )
    return None
Пример #10
0
    def test_iterator_behaviour(self):
        results = [
            '\x00spam & eggs\xFF',
            '\x00K\xc3\xbcss die Hand sch\xc3\xb6ne Frau\xFF',
            '\xFF\x00'][::-1]
        expected_results = [
            u'spam & eggs',
            u'Küss die Hand schöne Frau']
        def return_results(*args, **kwargs):
            return results.pop()
        self.socket.recv.side_effect = return_results

        ws = WebSocket(self.socket, self.protocol)
        for i, message in enumerate(ws):
            self.assertEquals(message, expected_results[i])
Пример #11
0
    def test_message_sending(self):
        ws = WebSocket(self.socket, self.protocol)
        ws.send('foobar')
        self.assertEquals(self.socket.sendall.call_count, 1)
        self.assertEquals(self.socket.sendall.call_args, (('\x00foobar\xFF',), {}))
        message = self.socket.sendall.call_args[0][0]
        self.assertEquals(type(message), str)

        ws.send(u'Küss die Hand schöne Frau')
        self.assertEquals(self.socket.sendall.call_count, 2)
        self.assertEquals(self.socket.sendall.call_args, (('\x00K\xc3\xbcss die Hand sch\xc3\xb6ne Frau\xFF',), {}))
        message = self.socket.sendall.call_args[0][0]
        self.assertEquals(type(message), str)
Пример #12
0
    def test_closing_socket_by_server(self):
        ws = WebSocket(self.socket, self.protocol)
        self.assertFalse(ws.closed)
        ws.close()
        self.assertEquals(self.socket.sendall.call_count, 1)
        self.assertEquals(self.socket.sendall.call_args, (('\xFF\x00',), {}))
        # don't close system socket! django still needs it.
        self.assertEquals(self.socket.shutdown.call_count, 0)
        self.assertEquals(self.socket.close.call_count, 0)
        self.assertTrue(ws.closed)

        # closing again will not send another close message
        ws.close()
        self.assertTrue(ws.closed)
        self.assertEquals(self.socket.sendall.call_count, 1)
        self.assertEquals(self.socket.shutdown.call_count, 0)
        self.assertEquals(self.socket.close.call_count, 0)