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,), {}))
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,), {}))
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)
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)
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")
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)
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')
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)
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
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])
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)
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)