gendesign/tradein-mvp/packages/scraper-kit/src/scraper_kit/proxy_errors.py
lekss361 7d13e93792
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
fix(tradein/scraper): не ходить через мёртвый запасной прокси (#2634)
Co-authored-by: lekss361 <lekss361@gendsgn.local>
Co-committed-by: lekss361 <lekss361@gendsgn.local>
2026-08-04 18:27:49 +00:00

40 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Общее исключение "нет доступного прокси" (#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"]