Example #1
0
    def test_send_nowait(self):
        # Use a queue to check the bytes written by MessageSender.
        # request.connection.written_data() cannot be used here because
        # MessageSender runs in a separate thread.
        send_queue = Queue.Queue()

        def write(bytes):
            send_queue.put(bytes)

        request = _create_blocking_request_hixie75()
        request.connection.write = write

        sender = msgutil.MessageSender(request)

        sender.send_nowait('Hello')
        sender.send_nowait('World')
        self.assertEqual('\x00Hello\xff', send_queue.get())
        self.assertEqual('\x00World\xff', send_queue.get())
Example #2
0
    def test_send(self):
        request = _create_blocking_request()
        sender = msgutil.MessageSender(request)

        sender.send('World')
        self.assertEqual(b'\x81\x05World', request.connection.written_data())
Example #3
0
    def test_send(self):
        request = _create_blocking_request_hixie75()
        sender = msgutil.MessageSender(request)

        sender.send('World')
        self.assertEqual('\x00World\xff', request.connection.written_data())
Example #4
0
def web_socket_transfer_data(request):
    """
    Loop while connection exists and process data to be sent and received.
    """

    try:
        line = request.ws_stream.receive_message()
        if str(line).startswith('username'):
            username = str(line)[8:]
        line = request.ws_stream.receive_message()
        if str(line).startswith('password'):
            passwd = 'AIR_' + str(line)[8:]
        out_message = ''
        client = xmpp.Client('pvp.net', debug=[])
        if client.connect(server=('chat.na1.lol.riotgames.com', 5223)) == "":
            request.ws_stream.send_message(CONN_ERROR, binary=False)
            return
        if client.auth(username, passwd, "xiff") == None:
            request.ws_stream.send_message(AUTH_ERROR, binary=False)
            return
        if client.isConnected():
            keepalive = datetime.now()
            client.sendInitPresence(requestRoster=1)
            pres = xmpp.Presence(show='chat')
            pres.setStatus(STATUS_MSG)
            client.send(pres)

            message_sender = msgutil.MessageSender(request)
            message_receiver = msgutil.MessageReceiver(request)

            incoming_thread = CheckMessages(client, message_sender)
            incoming_thread.setDaemon(True)
            incoming_thread.start()

            client.RegisterHandler('presence', incoming_thread.presence_update)
            client.RegisterHandler('message', incoming_thread.message_update)

            request.ws_stream.send_message(CONN_SUCCESS, binary=False)
            to_jid = None #jid for the user receiving the message
            while True:
                line = message_receiver.receive_nowait()
                if client.isConnected():    #Check connection on each loop
                    if line != None:
                        out_message = str(line)
                        if ((out_message != "Keep alive") and (out_message != "Kill session")):
                            split_out = out_message.split()
                            roster = client.getRoster()
                            try:
                                if split_out[0] == '#:#outmessage#:#':
                                    to_jid = split_out[1][3:-3]
                                    out_message = ' '.join(split_out[2:])
                            except IndexError:
                                to_jid = None
                                out_message = ''

                            if to_jid:
                                for user in incoming_thread.alive_users:
                                    if str(roster.getName(user)).lower() == str(to_jid).lower():
                                        to_jid = user
                                        valid_jid = True
                                        break
                                    else:
                                        valid_jid = False
                                if valid_jid:
                                    message = xmpp.Message(to_jid, out_message)
                                    message.setAttr('type', 'chat')
                                    client.send(message)
                                else:
                                    request.ws_stream.send_message(USER_WARNING, binary=False)
                        if (out_message == "Kill session"):
                            client.disconnect()
                            return
                    if (datetime.now() - keepalive).seconds > WEBSOCKET_TIMEOUT:
                        client.disconnect()
                        return
                else:
                    try:
                        request.ws_stream.send_message(CONN_ERROR, binary=False)
                    except:     #Don't crap out and leave a zombie process if the xmpp connection drops along with the websocket session
                        pass
                    return

                #Execute keep alive request regardless of the status of the xmpp connection
                if (str(line) == "Keep alive"):
                    keepalive = datetime.now()
                #Throttle message receiving otherwise the non-blocking state of the loop will cause it to execute as fast as possible
                time.sleep(RECEIVE_BUFFER)
        else:
            try:
                request.ws_stream.send_message(CONN_ERROR, binary=False)
            except:     #Don't crap out and leave a zombie process if the xmpp connection drops along with the websocket session
                pass
            return
    except: #Something was causing apache to overload... Meh?
        return