def send(self): if self.delivery: self.logger.log( "send(): Do not send - delivery to be aborted is in flight") return op, size = self.program.pop(0) if len(self.program) > 0 else (None, None) self.logger.log("send - op=%s, size=%s" % (str(op), str(size))) if op == None: return body = "" if op == 'F': body = "FINISH" else: bod = str(size) bod2 = "0000000000" + bod bod3 = "." + bod2[-9:] body = bod3 * (size // 10) msg = Message(body=body) if op in 'DF': self.logger.log("send(): Send message size: %d" % (size)) delivery = self.sender1.send(msg) if op == 'A': self.logger.log("send(): Start aborted message size: %d" % (size)) self.delivery = self.sender1.delivery(self.sender1.delivery_tag()) encoded = msg.encode() self.sender1.stream(encoded)
def send(self): op, size = self.program.pop(0) if len(self.program) > 0 else (None, None) if op == None: return body = "" if op == 'F': body = "FINISH" else: for i in range(size / 10): body += "0123456789" msg = Message(body=body) if op in 'DF': delivery = self.sender1.send(msg) if op == 'A': self.delivery = self.sender1.delivery(self.sender1.delivery_tag()) encoded = msg.encode() self.sender1.stream(encoded)
def send(self): op, size = self.program.pop(0) if len(self.program) > 0 else (None, None) if op == None: return body = "" if op == 'F': body = "FINISH" else: for i in range(size // 10): body += "0123456789" msg = Message(body=body) if op in 'DF': delivery = self.sender1.send(msg) if op == 'A': self.delivery = self.sender1.delivery(self.sender1.delivery_tag()) encoded = msg.encode() self.sender1.stream(encoded)
class Stream: def __init__(self, store = None): self.store = store or Store() self.handlers = [CFlowController(), CHandshaker()] self.incoming = [] self.outgoing = [] self.message = Message() self.closed = False def put(self, msg): if isinstance(msg, Message): self.store.put(msg.encode(), address=msg.address) else: self.message.body = msg self.store.put(self.message.encode()) def close(self): self.closed = True def on_link_local_open(self, event): self.setup(event) def on_link_remote_open(self, event): self.setup(event) def setup(self, event): snd = event.sender if snd and not hasattr(snd, "reader"): snd.reader = self.store.reader(snd.remote_source.address or snd.source.address or snd.remote_target.address or snd.target.address) self.outgoing.append(snd) elif event.receiver and event.receiver not in self.incoming: self.incoming.append(event.receiver) def on_link_final(self, event): if event.sender: event.sender.reader.close() self.outgoing.remove(event.sender) else: self.incoming.remove(event.receiver) def on_link_flow(self, event): if event.sender: self.pump_sender(event.sender) def pump_sender(self, snd): while snd.reader.more() and snd.credit > 0 and snd.queued < 1024: entry = snd.reader.next() dlv = snd.delivery(snd.delivery_tag()) snd.send(entry.message) dlv.settle() if not snd.reader.more(): snd.drained() if self.closed: snd.close() def pump(self): self.queued = 0 for snd in self.outgoing: self.pump_sender(snd) self.queued += snd.queued self.store.gc() self.store.flush() def on_reactor_quiesced(self, event): self.pump() def on_delivery(self, event): rcv = event.receiver dlv = event.delivery if rcv and not dlv.partial: msg = rcv.recv(dlv.pending) address = rcv.target.address self.store.put(msg, address=address) dlv.settle() def _matches(self, host, port, address, link): if host is None: return False else: if link.is_sender: terminus = link.target else: terminus = link.source return (link.connection.hostname == "%s:%s" % (host, port) and terminus.address == address) def relink(self, sender=True, receiver=True, host=None, port=None, address=None): log.debug("relinking stream: sender=%s, receiver=%s", sender, receiver) if sender: for l in self.outgoing: if self._matches(host, port, address, l): log.debug("omitting spurious relink") else: l._relink = True l.close() if receiver: for l in self.incoming: if self._matches(host, port, address, l): log.debug("omitting spurious relink") else: l._relink = True l.close()
class Stream: def __init__(self, store=None): self.store = store or Store() self.handlers = [CFlowController(), CHandshaker(), Decoder()] self.incoming = [] self.outgoing = [] self.message = Message() self.closed = False def put(self, msg): if isinstance(msg, Message): self.store.put(msg.encode(), address=msg.address) else: self.message.body = msg self.store.put(self.message.encode()) def close(self): self.closed = True def on_link_local_open(self, event): self.setup(event) def on_link_remote_open(self, event): self.setup(event) def setup(self, event): snd = event.sender if snd and not hasattr(snd, "reader"): rsa = snd.remote_source.address lsa = snd.source.address rta = snd.remote_target.address lta = snd.target.address snd.reader = self.store.reader(rsa or lsa or rta or lta) self.outgoing.append(snd) elif event.receiver and event.receiver not in self.incoming: rcv = event.receiver self.incoming.append(rcv) def on_link_final(self, event): if event.sender: event.sender.reader.close() self.outgoing.remove(event.sender) else: self.incoming.remove(event.receiver) def on_link_flow(self, event): if event.sender: self.pump_sender(event.sender) def pump_sender(self, snd): while snd.reader.more() and snd.credit > 0 and snd.queued < 1024: entry = snd.reader.next() dlv = snd.delivery(snd.delivery_tag()) snd.send(entry.message) dlv.settle() if not snd.reader.more(): snd.drained() if self.closed: snd.close() def pump(self): self.queued = 0 for snd in self.outgoing: self.pump_sender(snd) self.queued += snd.queued self.store.gc() self.store.flush() def on_reactor_quiesced(self, event): self.pump() ctr = 0 def on_encoded_message(self, event): rcv = event.receiver dlv = event.delivery if rcv and not dlv.partial: try: self.ctr += 1 msg = dlv.encoded except: raise address = rcv.target.address self.store.put(msg, address=address) log.debug("incoming delivery=%s", dlv) dlv.settle() def _matches(self, host, port, address, link): if host is None: return False else: if link.is_sender: terminus = link.target else: terminus = link.source return (link.connection.hostname == "%s:%s" % (host, port) and terminus.address == address) def relink(self, sender=True, receiver=True, host=None, port=None, address=None): log.debug("relinking stream: sender=%s, receiver=%s", sender, receiver) if sender: for l in self.outgoing: if self._matches(host, port, address, l): log.debug("omitting spurious relink") else: l._relink = True l.close() if receiver: for l in self.incoming: if self._matches(host, port, address, l): log.debug("omitting spurious relink") else: l._relink = True l.close()