Files
contracts-flask/History/opus-drhider-http2-error-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

63 lines
2.4 KiB
Markdown
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.
# Opus — ERR_HTTP2_PROTOCOL_ERROR на DrHider
Файл: `/home/naeel/nubes/contracts/contracts-flask/History/opus-drhider-http2-error-2026-06-29.md`
29.06.2026
## Симптом
Браузер: `POST /api/drhider``net::ERR_HTTP2_PROTOCOL_ERROR`
curl с сервера (Linux): работает, HTTP/2, 200 OK.
Браузер пользователя (Windows, Chrome 144): ERR_HTTP2_PROTOCOL_ERROR.
## Архитектура
```
Browser → Nubes Managed Python → gunicorn (1 worker, --timeout 300) → Flask app
```
Dockerfile:
```
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--timeout", "300", "--workers", "1", "site.app:app"]
```
## Код обработчика
```python
@app.route("/api/drhider", methods=["POST"])
def api_drhider():
from services.drhider import obfuscate_files
uploaded = request.files.getlist("files")
...
job_id = uuid.uuid4().hex
_drhider_jobs[job_id] = {"done": False, "data": None, "error": None}
def _process():
try:
from services.llm_client import HttpxLLMClient
llm = HttpxLLMClient(LLM_URL, LLM_KEY, LLM_MODEL) if LLM_KEY else None
zip_data, _csv = obfuscate_files(files, llm_client=llm)
_drhider_jobs[job_id] = {"done": True, "data": zip_data, "error": None}
except Exception as e:
_drhider_jobs[job_id] = {"done": True, "data": None, "error": str(e)}
threading.Thread(target=_process, daemon=True).start()
return jsonify({"ok": True, "job_id": job_id})
```
## Что известно
1. curl работает (HTTP/2, 200, возвращает `{"job_id":"...","ok":true}`)
2. Браузер — ERR_HTTP2_PROTOCOL_ERROR
3. Мелкие файлы и большие — одинаково
4. До перехода на gunicorn + threading — была та же ошибка? (не уверен)
## Вопросы
1. Может ли `threading.Thread` внутри Flask/gunicorn вызывать ERR_HTTP2_PROTOCOL_ERROR?
2. Может ли проблема быть в том, что gunicorn с 1 worker не поддерживает HTTP/2 должным образом?
3. Нужно ли добавить `--worker-class` к gunicorn (gevent/eventlet) для HTTP/2?
4. Может ли Nubes-прокси перед managed-сервисом вызывать эту ошибку?
5. Что попробовать в первую очередь?