def METHOD_NAME(self, size):
    try:
        # keep reading from the generator until the buffer of this stream has enough data to read
        while self._point + size > self._download_offset:
            self._buf += self.__next__()
    except StopIteration:
        self.file_length = self._download_offset
    start_point = self._point
    # EOF
    self._point = min(self._point + size, self._download_offset)
    relative_start = start_point - self._buf_start
    if relative_start < 0:
        raise ValueError("Buffer has dumped too much data")
    relative_end = relative_start + size
    data = self._buf[relative_start: relative_end]
    # dump the extra data in buffer
    # buffer start--------------------16bytes----current read position
    dumped_size = max(relative_end - 16 - relative_start, 0)
    self._buf_start += dumped_size
    self._buf = self._buf[dumped_size:]
    return data