Files
contracts-flask/History/opus-drhider-failed-to-fetch-2026-06-29.md
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

51 lines
2.9 KiB
Markdown
Raw Permalink 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.
# 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)
```javascript
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 (без технического жаргона).