Esempio n. 1
0
 def _start_sending(self):
     _logger.debug('%s, _start_sending', str(self))
     if self._close_ev is not None:
         return
     if not Event.isEventSet(self._wev):
         _logger.debug('%s, _start_sending::addEvent', str(self))
         Event.addEvent(self._wev)
Esempio n. 2
0
    def _on_receive(self):
        _logger.debug('%s, _on_receive', str(self))
        buff_size = 2 ** 16
        while True:
            try:
                recv, addr = self._recv(buff_size)
                if len(recv) == 0:
                    self._receive_fin()
                    return
                _logger.debug("%s, received %d bytes", str(self), len(recv))
            except self._errorType as msg:
                if msg.errno != errno.EAGAIN and msg.errno != errno.EINPROGRESS:
                    _logger.warning('%s, recv occurs error(%d): %s',
                                    str(self), msg.errno, msg.strerror)
                    self._error = True
                    self._do_close()
                return

            if self._decode_error:
                consumed = [recv]
            else:
                try:
                    consumed = self._decode(recv)
                except Exception as ex:
                    if self._on_decode_error is not None:
                        _logger.debug('decode error: %s', str(ex))
                        self._decode_error = True
                    else:
                        _logger.error('decode error: %s', str(ex))
                        _logger.error('%s', traceback.format_exc())
                        self._error = True
                        self._do_close()
                        return
                    consumed = [recv]

            stop = False
            try:
                for data in consumed:
                    if self._decode_error:
                        ret = self._on_decode_error(self, data)
                    else:
                        ret = self._on_received(self, data, addr)
                    if not ret:
                        stop = True
            except Exception as ex:
                if self._decode_error:
                    _logger.error('_onDecodeError error: %s', str(ex))
                else:
                    _logger.error('_on_received error: %s', str(ex))
                _logger.error('%s', traceback.format_exc())
                self._error = True
                self._do_close()
                return

            if stop:
                self.stop_receiving()

            if not Event.isEventSet(self._rev):
                break
Esempio n. 3
0
    def _on_close(self):
        _logger.debug('%s, _on_close', str(self))

        if self._fin_ev is not None:
            self._fin_ev.del_timer()

        assert(not Event.isEventSet(self._wev))
        assert(not Event.isEventSet(self._rev))

        self._close()
        self._connected = False
        self._closed = True
        if self._on_closed is not None:
            try:
                self._on_closed(self)
            except Exception as ex:
                _logger.error('_on_closed: %s', ex)
                _logger.error('%s', traceback.format_exc())
Esempio n. 4
0
 def start_receiving(self):
     _logger.debug('%s, start_receiving', str(self))
     if self._close_ev is not None:
         return
     if not self._connected or self._fin_received or self.is_closed():
         return
     if not Event.isEventSet(self._rev):
         _logger.debug('%s, start_receiving::addEvent', str(self))
         Event.addEvent(self._rev)
Esempio n. 5
0
    def is_ready_to_send(self):
        if not self._connected or self.is_closed():
            return False

        return Event.isEventSet(self._wev)
Esempio n. 6
0
 def _stop_sending(self):
     _logger.debug('%s, _stop_sending', str(self))
     if Event.isEventSet(self._wev):
         _logger.debug('%s, _stop_sending::delEvent', str(self))
         Event.delEvent(self._wev)
Esempio n. 7
0
 def stop_receiving(self):
     _logger.debug('%s, stop_receiving', str(self))
     if Event.isEventSet(self._rev):
         _logger.debug('%s, stop_receiving::delEvent', str(self))
         Event.delEvent(self._rev)