コード例 #1
0
    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)
コード例 #2
0
    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)
コード例 #3
0
    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)
コード例 #4
0
ファイル: stream.py プロジェクト: alisheikh/datawire-common
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()
コード例 #5
0
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()