Files
contracts/history/session-03-fix-http2.md
T

3.6 KiB
Raw Blame History

Анализ ошибки ERR_HTTP2_PROTOCOL_ERROR (15.06.2026)

Проблема

При загрузке нескольких или тяжелых файлов (PDF/DOCX) через форму на главной странице, браузер через 30 секунд выдает ошибку ERR_HTTP2_PROTOCOL_ERROR.

Причина

В текущей реализации app.py функция _upload_files выполняет синхронный парсинг каждого файла в цикле:

  1. Сохранение байтов в БД.
  2. parser_mod.parse(file_bytes, mime) — тяжелая операция (особенно PDF через pdfplumber или DOC через libreoffice).
  3. Формирование текста через textify.
  4. Обновление БД.

Если суммарное время парсинга всех файлов превышает 30 секунд, K8s Ingress обрывает соединение, не дождавшись HTTP-ответа (Redirect) от Flask.

План действий

  1. Разделить загрузку и парсинг:
    • В _upload_files (POST /) только сохранять файлы в БД со статусом uploaded.
    • Сразу делать редирект на страницу договора.
  2. Перенести парсинг в процесс обработки:
    • В _process (POST /process/) добавить шаг: если документ еще не распарсен (status='uploaded'), сначала вызвать parser и textify.
  3. Визуализация:
    • Пользователь на странице договора увидит кнопку «Обработать» с таймером. Теперь и парсинг, и LLM будут работать под этим таймером, не блокируя загрузку.

Статус

  • Оптимизировать app.py (убрать парсинг из загрузки).
  • Обновить _process (добавить ленивый парсинг).
  • Добавить таймер на загрузку.
  • РЕШЕНО: Перевод обработки в Background Thread (threading) для обхода таймаутов Ingress.
  • ФИКС ZIP: Добавлена логика обхода вложенных файлов в _run_processing_task (раньше ZIP возвращал пустой текст).

План "Асинхронное спасение" (15.06.2026 16:00)

  1. Threading: В app.py запуск обработки в фоновом потоке, чтобы сразу вернуть ответ 200 OK.
  2. Polling: Фронтенд опрашивает статус обработки.
  3. No More POST: Замена классической формы на fetch(), чтобы убрать окно "Подтвердите отправку" при F5.

Дополнение от 15:40

Проблема ERR_HTTP2_PROTOCOL_ERROR на загрузке (даже без парсинга) указывает на то, что сама передача байтов в БД через db.execute для нескольких файлов занимает более 30 секунд. Решение:

  1. Визуальный таймер поможет понять реальное время «зависания».
  2. Если ошибка повторится — это жесткий лимит Ingress на размер тела запроса (Client Max Body Size) или таймаут записи в сетевую БД.