36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
"""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")
|