예제 #1
0
    def test_all_points_extra(self):
        message = 'hello'
        extra = b'world'
        msg = toSendBuffer(message)
        origmsglen = len(msg)
        msg += extra
        for point in range(origmsglen+1, len(msg)):
            rcv = ReceiveBuffer()
            assert not rcv.isDone()
            assert rcv.is_empty()

            rcv.addMore(msg[:point])
            assert rcv.isDone()
            assert not rcv.is_empty()

            print(rcv.completed())
            rmsg, rextra = rcv.completed()
            assert rmsg == message
            assert rextra == extra[:point-origmsglen]
예제 #2
0
    def test_all_points_extra(self):
        message = 'hello'
        extra = b'world'
        msg = toSendBuffer(message)
        origmsglen = len(msg)
        msg += extra
        for point in range(origmsglen + 1, len(msg)):
            rcv = ReceiveBuffer()
            assert not rcv.isDone()
            assert rcv.is_empty()

            rcv.addMore(msg[:point])
            assert rcv.isDone()
            assert not rcv.is_empty()

            print(rcv.completed())
            rmsg, rextra = rcv.completed()
            assert rmsg == message
            assert rextra == extra[:point - origmsglen]
예제 #3
0
class TCPIncoming(PauseWithBackoff):
    def __init__(self, acceptResponse):
        super(TCPIncoming, self).__init__()
        self._aResp = acceptResponse
        self._rData = ReceiveBuffer(serializer.loads)
        self._expires = datetime.now() + MAX_INCOMING_SOCKET_PERIOD
        self._aResp[0].setblocking(0)
        # Disable Nagle to transmit headers and acks asap
        self._aResp[0].setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        self._openSock = True
        self.failCount = 0

    @property
    def socket(self):
        return self._aResp[0] if self._openSock else None

    @property
    def fromAddress(self):
        return ActorAddress(TCPv4ActorAddress(*(self._aResp[1])))

    def delay(self):
        now = datetime.now()
        # n.b. include _pauseUntil from PauseWithBackoff
        return max(
            timedelta(seconds=0),
            min(self._expires - now,
                getattr(self, '_pauseUntil', self._expires) - now))

    def addData(self, newData):
        self._rData.addMore(newData)

    def remainingSize(self):
        return self._rData.remainingAmount()

    def receivedAllData(self):
        return self._rData.isDone()

    @property
    def data(self):
        return self._rData.completed()[0]

    def close(self):
        s = self.socket
        if s:
            self._openSock = False
            _safeSocketShutdown(s)

    def __del__(self):
        s = self.socket
        if s:
            self._openSock = False
            _safeSocketShutdown(s)

    def __str__(self):
        return 'TCPInc(%s)<%s>' % (str(self._aResp), str(self._rData))
예제 #4
0
    def test_all_points_incomplete_each_byte(self):
        message = 'hello'
        extra = b'world'
        msg = toSendBuffer(message)
        origmsglen = len(msg)
        msg += extra
        for point in range(1, origmsglen - 1):
            rcv = ReceiveBuffer()
            assert not rcv.isDone()
            assert rcv.is_empty()

            for bpos in range(point):
                rcv.addMore(msg[bpos:bpos+1])
            assert not rcv.isDone()
            assert not rcv.is_empty()
            assert rcv.completed() is None
예제 #5
0
    def test_all_points_incomplete_each_byte(self):
        message = 'hello'
        extra = b'world'
        msg = toSendBuffer(message)
        origmsglen = len(msg)
        msg += extra
        for point in range(1, origmsglen - 1):
            rcv = ReceiveBuffer()
            assert not rcv.isDone()
            assert rcv.is_empty()

            for bpos in range(point):
                rcv.addMore(msg[bpos:bpos + 1])
            assert not rcv.isDone()
            assert not rcv.is_empty()
            assert rcv.completed() is None
예제 #6
0
    def test_exact(self):
        message = 'hello'
        extra = b'world'
        msg = toSendBuffer(message)
        origmsglen = len(msg)
        msg += extra

        rcv = ReceiveBuffer()
        assert not rcv.isDone()
        assert rcv.is_empty()

        rcv.addMore(msg[:origmsglen])
        assert rcv.isDone()
        assert not rcv.is_empty()
        # py.test bug, cannot just: assert rcv.completed() == message, b''
        rmsg, rextra = rcv.completed()
        print(rmsg, rextra)
        assert rmsg == message
        assert b'' == rextra
예제 #7
0
    def test_exact(self):
        message = 'hello'
        extra = b'world'
        msg = toSendBuffer(message)
        origmsglen = len(msg)
        msg += extra

        rcv = ReceiveBuffer()
        assert not rcv.isDone()
        assert rcv.is_empty()

        rcv.addMore(msg[:origmsglen])
        assert rcv.isDone()
        assert not rcv.is_empty()
        # py.test bug, cannot just: assert rcv.completed() == message, b''
        rmsg, rextra = rcv.completed()
        print(rmsg, rextra)
        assert rmsg == message
        assert b'' == rextra
예제 #8
0
class TCPIncoming(PauseWithBackoff):
    def __init__(self, acceptResponse):
        super(TCPIncoming, self).__init__()
        self._aResp = acceptResponse
        self._rData = ReceiveBuffer(serializer.loads)
        self._expires = datetime.now() + MAX_INCOMING_SOCKET_PERIOD
        self._aResp[0].setblocking(0)
        # Disable Nagle to transmit headers and acks asap
        self._aResp[0].setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
        self._openSock = True
        self.failCount = 0
    @property
    def socket(self): return self._aResp[0] if self._openSock else None
    @property
    def fromAddress(self): return ActorAddress(TCPv4ActorAddress(*(self._aResp[1])))
    def delay(self):
        now = datetime.now()
        # n.b. include _pauseUntil from PauseWithBackoff
        return max(timedelta(seconds=0),
                   min(self._expires - now,
                       getattr(self, '_pauseUntil', self._expires) - now))
    def addData(self, newData): self._rData.addMore(newData)
    def remainingSize(self): return self._rData.remainingAmount()
    def receivedAllData(self): return self._rData.isDone()
    @property
    def data(self): return self._rData.completed()[0]
    def close(self):
        s = self.socket
        if s:
            self._openSock = False
            _safeSocketShutdown(s)
    def __del__(self):
        s = self.socket
        if s:
            self._openSock = False
            _safeSocketShutdown(s)
    def __str__(self): return 'TCPInc(%s)<%s>'%(str(self._aResp), str(self._rData))