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