All checks were successful
Deploy Trade-In / changes (push) Successful in 10s
Deploy Trade-In / build-frontend (push) Successful in 38s
Deploy Trade-In / build-browser (push) Successful in 2m18s
Deploy Trade-In / test (push) Successful in 2m44s
Deploy Trade-In / build-backend (push) Successful in 1m37s
Deploy Trade-In / deploy (push) Successful in 2m27s
Co-authored-by: lekss361 <lekss361@gendsgn.local> Co-committed-by: lekss361 <lekss361@gendsgn.local>
40 lines
2.5 KiB
Python
40 lines
2.5 KiB
Python
"""Общее исключение "нет доступного прокси" (#2616 шаг 1).
|
||
|
||
Раньше `proxy_pool.acquire()` вернувший `None` в прод-окружении означал молчаливый
|
||
fallback на env-прокси (`AVITO_PROXY_URL`/`CIAN_PROXY_URL`/`YANDEX_PROXY_URL`/
|
||
`BROWSER_PROXY_*`) — все они мертвы (подписку mobileproxy закрыли, проверено вживую
|
||
#2613: 407/connection refused/invalid credentials). Итог — код либо шёл в HTTP-запрос
|
||
через заведомо мёртвый узел, либо (browser-путь) camoufox лез напрямую с IP сервера.
|
||
|
||
`NoProxyAvailableError` — явный, распознаваемый маркер "у нас нет доступного прокси
|
||
прямо сейчас" (наша инфраструктура), НЕ "площадка нас забанила" (`AvitoBlockedError`/
|
||
`AvitoRateLimitedError` — площадка) и НЕ "сетевая ошибка" (`httpx`/`curl_cffi` transport-
|
||
исключения). Поднимается ДО HTTP-запроса — ни один сетевой вызов не делается.
|
||
|
||
Подниматься должен ТОЛЬКО когда пул РЕАЛЬНО задействован (`use_pool=True`, то есть
|
||
`ScraperConfig.use_proxy_pool_curl`/`use_proxy_pool_browser` включён И `ProxyProvider`
|
||
передан) И окружение прод (`ScraperConfig.environment == "production"`). В dev/test/
|
||
config=None — легитимный direct/env-fallback путь не трогаем (см. providers/cian/
|
||
detail.py:118 "Пусто → прямое подключение (dev/no-op)").
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
|
||
class NoProxyAvailableError(RuntimeError):
|
||
"""Пул прокси пуст (или acquire упал) в прод-окружении — отказ, не HTTP-запрос.
|
||
|
||
Отличается от `AvitoBlockedError`/`AvitoRateLimitedError` (блокировка площадкой)
|
||
и от голых `httpx`/`curl_cffi` transport-исключений (сетевая ошибка) — это НАША
|
||
инфраструктура (нет живого прокси), не внешний блок.
|
||
"""
|
||
|
||
def __init__(self, provider: str) -> None:
|
||
self.provider = provider
|
||
super().__init__(
|
||
f"no proxy available for provider={provider!r} (pool empty in prod, "
|
||
f"refusing env/direct fallback — #2616)"
|
||
)
|
||
|
||
|
||
__all__ = ["NoProxyAvailableError"]
|