"""pull_file — вытащить файл с ВМ-буфера исходящим GET с ретраями.""" import logging import time from .config import PULL_RETRIES, PULL_RETRY_DELAY log = logging.getLogger("upload.upload_refs.pull") def pull_file(client, url: str) -> bytes: """GET url с ретраями; читает по частям (stream). Args: client: httpx.Client url: URL файла на ВМ-буфере. Returns: Содержимое файла (bytes). Raises: Последнюю ошибку попытки, если все ретраи не удались. """ last_err = None for attempt in range(PULL_RETRIES): try: with client.stream("GET", url) as resp: resp.raise_for_status() return b"".join(resp.iter_bytes()) except Exception as e: last_err = e log.warning("pull: attempt %d/%d failed url=%r: %r", attempt + 1, PULL_RETRIES, url, e) time.sleep(PULL_RETRY_DELAY) raise last_err if last_err else RuntimeError("pull failed")