Example #1
0
    def handle_read(self):
        try:
            received = self.recv(32768)

            self.received_strings.append(received)

            if is_python3():
                s = b''.join(self.received_strings)
                sbuffer = memoryview(s)
            else:
                s = ''.join(self.received_strings)
                sbuffer = buffer(s)

            consumedBytes = 0
            offset = 0
            received_messages = []

            while offset < len(sbuffer):

                if self.message is None:
                    try:
                        self.message = SpecMessage.message(
                            version=self.client_version,
                            order=self.client_order)
                    except:
                        import traceback
                        log.log(2, traceback.format_exc())

                consumedBytes = self.message.readFromStream(sbuffer[offset:])

                if consumedBytes == 0:
                    break

                offset += consumedBytes

                if self.message.isComplete():
                    # dispatch incoming message
                    if self.message.cmd == SpecMessage.HELLO:
                        self.client_order = self.message.packedHeaderDataFormat[
                            0]
                        self.client_version = self.message.vers
                        self.clientName = self.message.name
                        self.send_hello_reply(self.message.sn,
                                              str(self.server.name))
                    else:
                        received_messages.append(self.message)

                    self.message = None

            self.received_strings = [s[offset:]]

            for message in received_messages:
                if not self.dispatch_message(message):
                    self.send_error(
                        message.sn, '',
                        'unsupported command type : %d' % message.cmd)
        except:
            import traceback
            log.log(3, "SpecServer read error. %s" % traceback.format_exc())
            return
Example #2
0
    def handle_read(self):
        """Handle 'read' events on socket

        Messages are built from the read calls on the socket.
        """
        self.receivedStrings.append(self.recv(32768)) #read at most all the input buffer
        s = ''.join(self.receivedStrings)
        sbuffer = buffer(s)
        consumedBytes = 0
        offset = 0

        while offset < len(sbuffer):
            if self.message is None:
                self.message = SpecMessage.message(version = self.serverVersion)

            consumedBytes = self.message.readFromStream(sbuffer[offset:])

            if consumedBytes == 0:
                break

            offset += consumedBytes

            if self.message.isComplete():
                # dispatch incoming message
                if self.message.cmd == SpecMessage.REPLY:
                    replyID = self.message.sn

                    if replyID > 0:
                        try:
                            reply = self.registeredReplies[replyID]
                        except:
                            logging.getLogger("SpecClient").exception("Unexpected error while receiving a message from server")
                        else:
                            del self.registeredReplies[replyID]

                            reply.update(self.message.data, self.message.type == SpecMessage.ERROR, self.message.err)

                            #SpecEventsDispatcher.emit(self, 'replyFromSpec', (replyID, reply, ))
                elif self.message.cmd == SpecMessage.EVENT:
                    for name in SpecChannel.SpecChannel.channel_aliases[self.message.name]:
                        self.registeredChannels[name].update(self.message.data, deleted=self.message.flags == SpecMessage.DELETED)
                elif self.message.cmd == SpecMessage.HELLO_REPLY:
                    if self.checkourversion(self.message.name):
                        self.serverVersion = self.message.vers #header version
                        #self.state = CONNECTED
                        self.specConnected()
                    else:
                        self.serverVersion = None
                        self.connected = False
                        self.close()
                        self.state = DISCONNECTED

                self.message = None

        self.receivedStrings = [ s[offset:] ]
Example #3
0
    def handle_read(self):
        """Handle 'read' events on socket

        Messages are built from the read calls on the socket.
        """
        _received = self.recv(32768)

        self.received_strings.append(_received)

        if is_python3():
            s = b''.join(self.received_strings)
            sbuffer = memoryview(s)
        else:
            s = ''.join(self.received_strings)
            sbuffer = buffer(s)

        consumedBytes = 0
        offset = 0

        while offset < len(sbuffer):
            if self.message is None:
                self.message = SpecMessage.message(version=self.server_version)

            consumedBytes = self.message.readFromStream(sbuffer[offset:])

            if consumedBytes == 0:
                break

            offset += consumedBytes

            if self.message.isComplete():
                try:
                    # dispatch incoming message
                    if self.message.cmd == SpecMessage.REPLY:
                        self.dispatch_reply_msg(self.message)
                    elif self.message.cmd == SpecMessage.EVENT:
                        self.dispatch_event_msg(self.message)
                    elif self.message.cmd == SpecMessage.HELLO_REPLY:
                        self.dispatch_hello_reply_msg(self.message)
                except Exception as e:
                    self.message = None
                    self.received_strings = [s[offset:]]
                    raise SpecClientProtocolError(str(e))
                else:
                    self.message = None

        self.received_strings = [s[offset:]]
Example #4
0
    def handle_read(self):
        self.receivedStrings.append(self.recv(32768))
        s = ''.join(self.receivedStrings)
        sbuffer = buffer(s)
        consumedBytes = 0
        offset = 0
        received_messages = []

        while offset < len(sbuffer):
            if self.message is None:
                self.message = SpecMessage.message(version=self.clientVersion,
                                                   order=self.clientOrder)

            consumedBytes = self.message.readFromStream(sbuffer[offset:])

            if consumedBytes == 0:
                break

            offset += consumedBytes

            if self.message.isComplete():
                # dispatch incoming message
                if self.message.cmd == SpecMessage.HELLO:
                    self.clientOrder = self.message.packedHeaderDataFormat[0]
                    print "client byte order: ", self.clientOrder
                    self.clientVersion = self.message.vers
                    self.clientName = self.message.name
                    self.send_hello_reply(self.message.sn,
                                          str(self.server.name))
                else:
                    received_messages.append(self.message)

                self.message = None

        self.receivedStrings = [s[offset:]]

        for message in received_messages:
            if not self.dispatchIncomingMessage(message):
                self.send_error(message.sn, '',
                                'unsupported command type : %d' % message.cmd)
Example #5
0
    def handle_read(self):
        self.receivedStrings.append(self.recv(32768))
        s = ''.join(self.receivedStrings)
        sbuffer = buffer(s)
        consumedBytes = 0
        offset = 0
        received_messages = []

        while offset < len(sbuffer):
            if self.message is None:
                self.message = SpecMessage.message(version = self.clientVersion, order=self.clientOrder)

            consumedBytes = self.message.readFromStream(sbuffer[offset:])

            if consumedBytes == 0:
                break

            offset += consumedBytes

            if self.message.isComplete():
                # dispatch incoming message
                if self.message.cmd == SpecMessage.HELLO:
                    self.clientOrder = self.message.packedHeaderDataFormat[0]
                    print "client byte order: ", self.clientOrder
                    self.clientVersion = self.message.vers
                    self.clientName = self.message.name
                    self.send_hello_reply(self.message.sn, str(self.server.name))
                else:
                    received_messages.append(self.message)

                self.message = None

        self.receivedStrings = [ s[offset:] ]

        for message in received_messages:
          if not self.dispatchIncomingMessage(message):
            self.send_error(message.sn, '', 'unsupported command type : %d' % message.cmd)
Example #6
0
def connectionHandler(connection_ref, socket_to_spec):
    receivedStrings = []
    message = None
    serverVersion = None
    socket_to_spec.settimeout(None)

    conn = connection_ref()
    if conn is not None:
        conn.connected = True
        conn.state = WAITINGFORHELLO
        conn.socket = socket_to_spec
        conn.send_msg_hello()
        del conn

    while True:
        try:
            receivedStrings.append(socket_to_spec.recv(4096))
        except:
            receivedStrings.append("")

        if receivedStrings[-1] == "":
            conn = connection_ref()
            if conn is None:
                break
            conn.handle_close()
            del conn
            break

        s = "".join(receivedStrings)
        consumedBytes = 0
        offset = 0

        while offset < len(s):
            if message is None:
                message = SpecMessage.message(version=serverVersion)

            consumedBytes = message.readFromStream(s[offset:])

            if consumedBytes == 0:
                break

            offset += consumedBytes

            if message.isComplete():
                conn = connection_ref()
                if conn is None:
                    break

                try:
                    try:
                        # dispatch incoming message
                        if message.cmd == SpecMessage.REPLY:
                            replyID = message.sn
                            if replyID > 0:
                                try:
                                    reply = conn.registeredReplies[replyID]
                                except:
                                    logging.getLogger("SpecClient").exception(
                                        "Unexpected error while receiving a message from server"
                                    )
                                else:
                                    del conn.registeredReplies[replyID]
                                    # replies_queue.put((reply, message.data, message.type==SpecMessage.ERROR, message.err))
                                    gevent.spawn(
                                        reply.update, message.data, message.type == SpecMessage.ERROR, message.err
                                    )
                                    time.sleep(1e-6)
                        elif message.cmd == SpecMessage.EVENT:
                            try:
                                channel = conn.registeredChannels[message.name]
                            except KeyError:
                                pass
                            else:
                                # channels_queue.put((channel, message.data, message.flags == SpecMessage.DELETED))
                                gevent.spawn(channel.update, message.data, message.flags == SpecMessage.DELETED)
                                time.sleep(1e-6)
                        elif message.cmd == SpecMessage.HELLO_REPLY:
                            if conn.checkourversion(message.name):
                                serverVersion = message.vers  # header version
                                conn.serverVersion = serverVersion
                                gevent.spawn(conn.specConnected)
                                time.sleep(1e-6)
                            else:
                                serverVersion = None
                                conn.serverVersion = None
                                conn.connected = False
                                conn.disconnect()
                                conn.state = DISCONNECTED
                                if conn.scanport:
                                    conn.port += 1
                    except:
                        receivedStrings = [s[offset:]]
                        raise
                finally:
                    del conn
                    message = None

            receivedStrings = [s[offset:]]
    def handle_read(self):
        """Handle 'read' events on socket

        Messages are built from the read calls on the socket.
        """
        _received = self.recv(32768)

        #if is_python3():
        #_received = _received.decode('utf-8')

        self.receivedStrings.append(_received)

        log.log(DEBUG, "received new data from spec")

        if is_python3():
            s = b''.join(self.receivedStrings)
            sbuffer = memoryview(s)
            #sbuffer = bytes(sbuffer).decode('utf-8')
        else:
            s = ''.join(self.receivedStrings)
            sbuffer = buffer(s)

        consumedBytes = 0
        offset = 0

        while offset < len(sbuffer):
            if self.message is None:
                log.log(DEBUG, "creating a new message")
                self.message = SpecMessage.message(version=self.serverVersion)
            else:
                log.log(DEBUG, "adding data to existing message")

            consumedBytes = self.message.readFromStream(sbuffer[offset:])
            log.log(DEBUG, "  bytes consumed %s" % consumedBytes)

            log.log(DEBUG, " message complete? %s" % self.message.isComplete())

            if consumedBytes == 0:
                log.log(DEBUG, "  no bytes consumed")
                break

            offset += consumedBytes

            if self.message.isComplete():
                log.log(
                    DEBUG, "new message from spec %s / name %s" %
                    (self.message.cmd, self.message.name))
                try:
                    # dispatch incoming message
                    if self.message.cmd == SpecMessage.REPLY:
                        replyID = self.message.sn

                        if replyID > 0:
                            try:
                                reply = self.registeredReplies[replyID]
                            except:
                                log.exception(
                                    "Unexpected error while receiving a message from server"
                                )
                            else:
                                del self.registeredReplies[replyID]

                                reply.update(
                                    self.message.data,
                                    self.message.type == SpecMessage.ERROR,
                                    self.message.err)
                                #SpecEventsDispatcher.emit(self, 'replyFromSpec', (replyID, reply, ))
                    elif self.message.cmd == SpecMessage.EVENT:
                        log.log(
                            2, "got a new event from spec name=%s, data=%s" %
                            (self.message.name, self.message.data))
                        try:
                            self.registeredChannels[self.message.name].update(
                                self.message.data,
                                self.message.flags == SpecMessage.DELETED)
                        except KeyError:
                            import traceback
                            log.log(2, traceback.format_exc())
                        except:
                            import traceback
                            log.log(2, traceback.format_exc())
                        log.log(
                            DEBUG,
                            "AFTER event: %s" % str(self.registeredChannels))
                    elif self.message.cmd == SpecMessage.HELLO_REPLY:
                        if self.checkourversion(self.message.name):
                            self.serverVersion = self.message.vers  #header version
                            #self.state = CONNECTED
                            log.log(DEBUG, "Hello reply. all right. connected")
                            self.specConnected()
                        else:
                            self.serverVersion = None
                            self.connected = False
                            self.close()
                            self.state = DISCONNECTED
                except:
                    self.message = None
                    self.receivedStrings = [s[offset:]]
                    raise
                else:
                    self.message = None

        self.receivedStrings = [s[offset:]]
Example #8
0
def connectionHandler(connection_ref, socket_to_spec):
    receivedStrings = []
    message = None
    serverVersion = None
    socket_to_spec.settimeout(None)

    conn = connection_ref()
    if conn is not None:
        conn.connected = True
        conn.state = WAITINGFORHELLO
        conn.socket = socket_to_spec
        conn.send_msg_hello()
        del conn

    while True:
        try:
            receivedStrings.append(socket_to_spec.recv(4096))
        except:
            receivedStrings.append("")

        if receivedStrings[-1] == "":
            conn = connection_ref()
            if conn is None:
                break
            conn.handle_close()
            del conn
            break

        s = ''.join(receivedStrings)
        consumedBytes = 0
        offset = 0

        while offset < len(s):
            if message is None:
                message = SpecMessage.message(version=serverVersion)

            consumedBytes = message.readFromStream(s[offset:])

            if consumedBytes == 0:
                break

            offset += consumedBytes

            if message.isComplete():
                conn = connection_ref()
                if conn is None:
                    break

                try:
                    try:
                        # dispatch incoming message
                        if message.cmd == SpecMessage.REPLY:
                            replyID = message.sn
                            if replyID > 0:
                                try:
                                    reply = conn.registeredReplies[replyID]
                                except:
                                    logging.getLogger("SpecClient").exception(
                                        "Unexpected error while receiving a message from server"
                                    )
                                else:
                                    del conn.registeredReplies[replyID]
                                    #replies_queue.put((reply, message.data, message.type==SpecMessage.ERROR, message.err))
                                    gevent.spawn(
                                        reply.update, message.data,
                                        message.type == SpecMessage.ERROR,
                                        message.err)
                                    time.sleep(1E-6)
                        elif message.cmd == SpecMessage.EVENT:
                            try:
                                channel = conn.registeredChannels[message.name]
                            except KeyError:
                                pass
                            else:
                                #channels_queue.put((channel, message.data, message.flags == SpecMessage.DELETED))
                                gevent.spawn(
                                    channel.update, message.data,
                                    message.flags == SpecMessage.DELETED)
                                time.sleep(1E-6)
                        elif message.cmd == SpecMessage.HELLO_REPLY:
                            if conn.checkourversion(message.name):
                                serverVersion = message.vers  #header version
                                conn.serverVersion = serverVersion
                                gevent.spawn(conn.specConnected)
                                time.sleep(1E-6)
                            else:
                                serverVersion = None
                                conn.serverVersion = None
                                conn.connected = False
                                conn.disconnect()
                                conn.state = DISCONNECTED
                                if conn.scanport:
                                    conn.port += 1
                    except:
                        receivedStrings = [s[offset:]]
                        raise
                finally:
                    del conn
                    message = None

            receivedStrings = [s[offset:]]
Example #9
0
    def handle_read(self):
        """Handle 'read' events on socket

        Messages are built from the read calls on the socket.
        """
        self.receivedStrings.append(
            self.recv(32768))  #read at most all the input buffer
        s = ''.join(self.receivedStrings)
        sbuffer = buffer(s)
        consumedBytes = 0
        offset = 0

        while offset < len(sbuffer):
            if self.message is None:
                self.message = SpecMessage.message(version=self.serverVersion)

            consumedBytes = self.message.readFromStream(sbuffer[offset:])

            if consumedBytes == 0:
                break

            offset += consumedBytes

            if self.message.isComplete():
                try:
                    # dispatch incoming message
                    if self.message.cmd == SpecMessage.REPLY:
                        replyID = self.message.sn

                        if replyID > 0:
                            try:
                                reply = self.registeredReplies[replyID]
                            except:
                                logging.getLogger("SpecClient").exception(
                                    "Unexpected error while receiving a message from server"
                                )
                            else:
                                del self.registeredReplies[replyID]

                                reply.update(
                                    self.message.data,
                                    self.message.type == SpecMessage.ERROR,
                                    self.message.err)
                                #SpecEventsDispatcher.emit(self, 'replyFromSpec', (replyID, reply, ))
                    elif self.message.cmd == SpecMessage.EVENT:
                        try:
                            self.registeredChannels[self.message.name].update(
                                self.message.data,
                                self.message.flags == SpecMessage.DELETED)
                        except KeyError:
                            pass
                    elif self.message.cmd == SpecMessage.HELLO_REPLY:
                        if self.checkourversion(self.message.name):
                            self.serverVersion = self.message.vers  #header version
                            #self.state = CONNECTED
                            self.specConnected()
                        else:
                            self.serverVersion = None
                            self.connected = False
                            self.close()
                            self.state = DISCONNECTED
                except:
                    self.message = None
                    self.receivedStrings = [s[offset:]]
                    raise
                else:
                    self.message = None

        self.receivedStrings = [s[offset:]]