def on_new_data()

in fbtftp/base_handler.py [0:0]


    def on_new_data(self):
        """
        Called when new data is available on the socket.

        This method will extract acknowledged block numbers and handle
        possible errors.
        """
        # Note that we use blocking socket, because it has its own dedicated
        # process. We read only 512 bytes.
        try:
            listener = self._get_listener()
            listener.settimeout(self._timeout)
            data, peer = listener.recvfrom(constants.DEFAULT_BLKSIZE)
            listener.settimeout(None)
        except socket.timeout:
            return
        if peer != self._peer:
            logging.error("Unexpected peer: %s, expected %s" % (peer, self._peer))
            self._should_stop = True
            return
        code, block_number = struct.unpack("!HH", data[:4])
        if code == constants.OPCODE_ERROR:
            # When the client sends an OPCODE_ERROR#
            # the block number is the ERR codes in constants.py
            self._stats.error = {
                "error_code": block_number,
                "error_message": data[4:-1].decode("ascii", "ignore"),
            }
            # An error was reported by the client which terminates the exchange
            logging.error(
                "Error reported from client: %s" % self._stats.error["error_message"]
            )
            self._transmit_error()
            self._should_stop = True
            return
        if code != constants.OPCODE_ACK:
            logging.error(
                "Expected an ACK opcode from %s, got: %d" % (self._peer, code)
            )
            self._stats.error = {
                "error_code": constants.ERR_ILLEGAL_OPERATION,
                "error_message": "I only do reads, really",
            }
            self._transmit_error()
            self._should_stop = True
            return
        self._handle_ack(block_number)