Beispiel #1
0
    def send_response(self, code=STATUS_OK, result='', id=None):
        data = {'reply': [code, result, id]}

        if self.debug:
            log.msg('send REPLY %d' % id)

        data = encode(data)
        if isinstance(data, Fault):
            self.fault_received(data)
            return

        self.transport.write(STRUCT_INT.pack(len(data)) + data)
Beispiel #2
0
    def dataReceived(self, data):
        buffer, blen, offset, need = self._buffer
        buffer.write(data)
        blen += len(data)

        while blen > offset:
            if need == 0:
                try:
                    buffer.seek(offset)
                    need = STRUCT_INT.unpack(buffer.read(4))[0]
                    offset += 4
                    buffer.seek(blen)
                except struct_error:
                    self.fault_received(Fault(NOT_WELLFORMED_ERROR, 'Haven\'t got a length.'))
                    self._buffer = (StringIO(), 0, 0, 0,)
                    return False

            if blen - offset >= need:
                buffer.seek(offset)
                data = buffer.read(need)
                offset += need
                need = 0

                data = decode(data)
                if isinstance(data, Fault):
                    self.fault_received(data)
                    continue

                transaction, obj = data.iteritems().next()
                if not transaction in SUPPORTED_TRANSACTIONS:
                    self.fault_received(NOT_WELLFORMED_ERROR, 'Unknown transaction: %s' % transaction)
                    continue

                if transaction == 'call':
                    d = self.dispatch_call(obj[0], obj[3], obj[1], obj[2])
                    d.addCallback(self._callCb, obj[3])
                    d.addErrback(self._callEb, obj[3])
                elif transaction == 'reply':
                    self.dispatch_reply(obj[0], obj[1], obj[2])

            else:
                break

        if need == 0:
            data = buffer.read()
            buffer.seek(0)
            buffer.truncate()
            buffer.write(data)
            blen = len(data)
            offset = 0

        self._buffer = (buffer, blen, offset, need,)
Beispiel #3
0
    def call(self, method, *args, **kwargs):
        self.id += 1
        data = encode({'call': [method, args, kwargs, self.id]})

        if isinstance(data, Fault):
            return defer.fail(data)

        if self.debug:
            log.msg('send CALL %d %s' % (self.id, method))

        data = STRUCT_INT.pack(len(data)) + data
        self.transport.write(data)

        finished = defer.Deferred()
        self.calls[self.id] = finished

        return finished
Beispiel #4
0
def _recvsized(self):
    try:
        message_length = STRUCT_INT.unpack(self.recv(4))[0]
    except struct_error:
        return Fault(NOT_WELLFORMED_ERROR, 'Haven\'t got a length.')

    sock_buf = StringIO()
    bytes_count = 0
    while bytes_count < message_length:
        chunk = self.recv(min(message_length - bytes_count, 32768))
        part_count = len(chunk)

        if part_count < 1:
            return None

        bytes_count += part_count
        sock_buf.write(chunk)

    return sock_buf.getvalue()
Beispiel #5
0
def _recvsized(self):
    try:
        message_length = STRUCT_INT.unpack(self.recv(4))[0]
    except struct_error:
        return Fault(NOT_WELLFORMED_ERROR, 'Haven\'t got a length.')

    sock_buf = StringIO()
    bytes_count = 0
    while bytes_count < message_length:
        chunk = self.recv(min(message_length - bytes_count, 32768))
        part_count = len(chunk)

        if part_count < 1:
            return None

        bytes_count += part_count
        sock_buf.write(chunk)

    return sock_buf.getvalue()
Beispiel #6
0
def _sendsized(self, data):
    data = STRUCT_INT.pack(len(data)) + data
    self.sendall(data)
Beispiel #7
0
def _sendsized(self, data):
    data = STRUCT_INT.pack(len(data)) + data
    self.sendall(data)