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)
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,)
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
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()
def _sendsized(self, data): data = STRUCT_INT.pack(len(data)) + data self.sendall(data)