def _download_part_check_cancel()

in alibabacloud_oss_v2/filelike.py [0:0]


    def _download_part_check_cancel(self, start, size):
        got = 0
        error: Exception = None
        request = self._request

        while True:
            if self._canceling:
                error = CancelTask()
                break

            request.range_header = f'bytes={start + got}-{start + size - 1}'
            request.range_behavior = 'standard'
            result = self._base._client.get_object(request)

            error = _check_object_same(self._modtime, self._etag, start, result)
            if error:
                break

            try:
                kwargs = {}
                if self._block_size:
                    kwargs['block_size'] = self._block_size
                with self._condition:
                    self._stream_reader = result.body
                    self._stream_iter = result.body.iter_bytes(**kwargs)
                    if self._canceling:
                        error = CancelTask()
                        break

                for d in self._stream_iter:
                    if self._canceling:
                        error = CancelTask()
                        break
                    got += len(d)
                    self._data_queue.put(d)
                break
            except Exception:
                pass
            finally:
                if self._stream_reader:
                    self._stream_reader.close()
                self._stream_reader = None
                self._stream_iter = None

        if error:
            raise error

        if got != size:
            raise ValueError("expect size {size}, but got {got}")

        self._data_queue.put(b'')