fix(browser-sidecar): бан-страница площадки отдаётся 403, а не 500 (#3288 п.C) #3379

Merged
bot-backend merged 2 commits from fix/3288-sidecar-ban-status-code into main 2026-09-05 21:46:29 +00:00
Collaborator

Часть #3288 (п. C). Не закрывает issue.

Дефект. Сайдкар на BanPageDetectedError отвечал HTTP 500 — «наша ошибка», хотя это отказ площадки; текст SidecarBanPageError в логах говорил про «sidecar 500» (см. error-text-names-the-messenger — ложный гонец в трёх местах: avito/detail.py, avito/serp.py, domclick/detail.py).

Фикс. browser/server.py::fetch_handler: BanPageDetectedError403 (тело прежнее: error/ban_page/status). Клиент browser_fetcher.py распознаёт бан по телу (ban_page), не по коду — образы backend и browser деплоятся отдельно и расходятся на часы; гейт по коду уводил бы отказ площадки в инфра-ветку на время рассинхрона. Текст исключения: tradein-browser: площадка отдала бан-страницу (upstream 403, ответ сайдкара 403) — все три вызывающих подставляют {exc}, без правок провайдеров. 403 не 451 (451 — блок по закону). Своих 403 сайдкар не отдаёт (валидация 400/422, нет прокси/браузера — 503). classify_browser_probe кладёт любой >=400 в sidecar — поведение пробы не меняется. SidecarBanPageError в avito/serp стоит ДО soft-ban-эвристик по 503.

Тесты: browser/test_server_http_status.py, backend/tests/test_kit_browser_fetcher_status.py (в т.ч. legacy-500 остаётся распознанным).

Фальсификация (откат клиентского хунка + гейт «ban_page только на 500»): 4 failed — вместо SidecarBanPageError поднимается голый HTTPStatusError (инфра-ветка). Восстановлено.

Прогоны: backend -k "avito or ban or fetcher or sidecar or 3283 or 3287 or 3288" 712 passed; сайдкар-сьют 233 passed; ruff OK.

Приёмка на проде: после деплоя обоих образов первый зафиксированный бан площадки в логах backend — строка upstream N, ответ сайдкара 403 и ban_kind=platform в run counters, без HTTPStatusError 500 от tradein-browser.

Часть #3288 (п. C). Не закрывает issue. **Дефект.** Сайдкар на `BanPageDetectedError` отвечал HTTP 500 — «наша ошибка», хотя это отказ площадки; текст `SidecarBanPageError` в логах говорил про «sidecar 500» (см. [[error-text-names-the-messenger]] — ложный гонец в трёх местах: `avito/detail.py`, `avito/serp.py`, `domclick/detail.py`). **Фикс.** `browser/server.py::fetch_handler`: `BanPageDetectedError` → **403** (тело прежнее: `error`/`ban_page`/`status`). Клиент `browser_fetcher.py` распознаёт бан **по телу** (`ban_page`), не по коду — образы backend и browser деплоятся отдельно и расходятся на часы; гейт по коду уводил бы отказ площадки в инфра-ветку на время рассинхрона. Текст исключения: `tradein-browser: площадка отдала бан-страницу (upstream 403, ответ сайдкара 403)` — все три вызывающих подставляют `{exc}`, без правок провайдеров. 403 не 451 (451 — блок по закону). Своих 403 сайдкар не отдаёт (валидация 400/422, нет прокси/браузера — 503). `classify_browser_probe` кладёт любой `>=400` в `sidecar` — поведение пробы не меняется. `SidecarBanPageError` в avito/serp стоит ДО soft-ban-эвристик по 503. **Тесты:** `browser/test_server_http_status.py`, `backend/tests/test_kit_browser_fetcher_status.py` (в т.ч. legacy-500 остаётся распознанным). **Фальсификация** (откат клиентского хунка + гейт «ban_page только на 500»): 4 failed — вместо `SidecarBanPageError` поднимается голый `HTTPStatusError` (инфра-ветка). Восстановлено. **Прогоны:** backend `-k "avito or ban or fetcher or sidecar or 3283 or 3287 or 3288"` 712 passed; сайдкар-сьют 233 passed; ruff OK. **Приёмка на проде:** после деплоя обоих образов первый зафиксированный бан площадки в логах backend — строка `upstream N, ответ сайдкара 403` и `ban_kind=platform` в run counters, без `HTTPStatusError 500` от `tradein-browser`.
bot-backend added 1 commit 2026-09-05 21:04:23 +00:00
fix(tradein): сайдкар отдаёт подтверждённый бан площадки кодом 403, не 500
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 1m31s
CI Trade-In / backend-tests (pull_request) Successful in 4m58s
1200af58f5
Единственный код 500 означал и «площадка забанила», и «сайдкар упал»:
разбор каждого инцидента начинался с ложного следа — в лог провайдера и в
houses.imv_error_reason уезжала httpx-преамбула «Server error '500 Internal
Server Error' for url 'http://tradein-browser:3000/fetch'», то есть текст
ошибки называл гонца, а не виновника.

- browser/server.py: BanPageDetectedError → 403 (доступ ограничен площадкой);
  451 — про юридическую блокировку, это не она. Своих 403 сайдкар не отдаёт
  (400/422/503), код однозначен. classify_browser_probe не задета: у неё любой
  status >= 400 → "sidecar". Тело не меняется — ban_page/status на месте.
- scraper_kit/browser_fetcher.py: текст SidecarBanPageError теперь свой —
  «площадка отдала бан-страницу (upstream 403, ответ сайдкара 403): …».
  Распознавание остаётся по ТЕЛУ и code-agnostic: tradein-browser — отдельный
  образ со своим деплоем, версии штатно расходятся на часы, и гейт по коду в
  этот час уводил бы отказ площадки в инфра-ветку.
- Тесты: 403 → SidecarBanPageError; старый 500 + ban_page → он же; чистый 500
  без ban_page → прежний инфра-диагноз; текст ошибки без «500»/«Server error».

Refs #3288 п.4
Light1YT added 1 commit 2026-09-05 21:38:39 +00:00
test(#3288): фикстуры бан-страницы на 403 и 500, фальсифицируемые проверки текста; комментарий про путь текста
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 1m32s
CI Trade-In / backend-tests (pull_request) Successful in 5m7s
a5f60eaaa8
bot-backend merged commit 2426b529a8 into main 2026-09-05 21:46:29 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3379
No description provided.