Files
contracts-flask/History/opus-drhider-failed-to-fetch-2026-06-29.md
T
naeel ac8b325896
Deploy contracts-flask / validate (push) Successful in 0s
fix: full paths in all Opus History files
2026-06-29 16:54:44 +04:00

2.9 KiB
Raw Blame History

Opus — диагностика DrHider «Failed to fetch»

Файл: /home/naeel/nubes/contracts/contracts-flask/History/opus-drhider-failed-to-fetch-2026-06-29.md

29.06.2026

Симптом

Страница https://contractor.pythonk8s.services.ngcloud.ru/DrHider загружается (HTML новый, редизайн Nubes, версия v0.1). Пользователь выбирает файл, жмёт «Обфусцировать» → мгновенно ❌ Failed to fetch.

Что проверено

  1. VM: curl -X POST -F 'files=@file' http://127.0.0.1:8766/api/drhider → HTTP 200, валидный ZIP. Обработчик работает.
  2. Managed Flask → VM: curl -X POST -F 'files=@file' https://contractor.pythonk8s.services.ngcloud.ru/api/drhider → HTTP 200, валидный ZIP. Прокси работает.
  3. Managed Flask GET: curl https://contractor.pythonk8s.services.ngcloud.ru/DrHider → HTTP 200, новый HTML.
  4. nginx на VM: location /api/ проксирует на 127.0.0.1:8766.

Оба curl-теста проходят с моей машины (Linux) и с VM. Браузер пользователя (Windows, Chrome) — Failed to fetch мгновенно, без задержки.

Архитектура запроса

Браузер (Windows/Chrome)
  → POST /api/drhider (multipart/form-data)
  → contractor.pythonk8s.services.ngcloud.ru (Managed Flask, Nubes k8s)
  → httpx.Client.post("https://contracts.kube5s.ru/api/drhider", files=...)
  → nginx contracts.kube5s.ru → location /api/ → 127.0.0.1:8766
  → convert_server.py: do_POST → _handle_drhider → drhider.obfuscate_files()
  → ZIP ответ

Код фронтенда (JS inline в HTML)

const fd = new FormData();
files.forEach(f => fd.append('files', f));
const r = await fetch('/api/drhider', { method:'POST', body:fd, signal:AbortSignal.timeout(300000) });

Вопросы

  1. Почему curl работает, а браузер — нет? «Failed to fetch» мгновенное — не таймаут.
  2. Может ли managed-сервис Nubes блокировать POST с multipart/form-data? (nginx, WAF, etc.)
  3. Может ли httpx.Client.post(files=...) на managed Flask потерять файл при проксировании? (managed Flask перечитывает request.files, формирует новый multipart для httpx)
  4. Нужно ли добавить Access-Control-Allow-Origin на managed Flask, хотя запрос same-origin?
  5. Какие ещё причины мгновенного Failed to fetch в Chrome при работающем curl?

Что попросить пользователя сделать

Конкретные шаги для диагностики в Chrome DevTools (без технического жаргона).