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

2.4 KiB
Raw Blame History

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/drhidernet::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"]

Код обработчика

@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. Что попробовать в первую очередь?