Потоковый ответ Python Quart/Hypercorn, вызывающий net::ERR_HTTP2_PROTOCOL_ERROR 200

У меня есть приложение Quart, с помощью которого я передаю ответ клиенту. Я использую asyncio.sleep, чтобы отложить завершение ответа, если я установлю задержку на 59 секунд, все будет работать нормально. Поток завершается без проблем. Если я увеличу время до 120 секунд, ответ будет истекать. Это первая часть потока, полученная клиентом, но примерно через 60 секунд браузер выдает ошибку в Chrome: net::ERR_HTTP2_PROTOCOL_ERROR 200. Firefox выдает ошибку TypeError.

Я использую Hypercorn с Nginx.

файл hypercorn config.py гласит:

Shutdown_timeout = 123.0
ssl_handshake_timeout = 123.0
startup_timeout = 123.0

соответствующий параметр в nginx.conf:

location @proxy_to_app {
proxy_read_timout = 600s
}

Я не знаю, как это решить.

Я выяснил источник проблемы. Это не имеет ничего общего с Quart, Hypercorn или Nginx. Проблема связана с Cloudflare и http2, это вызвано WriteTimeout. Смотрите этот ответ: О чем net::ERR_HTTP2_PROTOCOL_ERROR?

Тогда возникает вопрос, как это изменить в Cloudlfare.

У меня нет Quart, настроенного для работы в http2, это поможет?

1 ответ

Единственное решение, которое я нашел, - это разбить сон и отправить клиенту промежуточные данные, чтобы поддерживать соединение.

async def async_generator():
      content_arr = [
          json.dumps({'first':'some data'}),
          json.dumps({'alive':''}),  #required to http2 connection alive
          json.dumps({'final' : 'final data'})
      ]
      for i,html in enumerate(content_arr):
          print(i)
          if i > 0:
              await asyncio.sleep(59)  #this delays sending the final data 118 seconds
          yield html.encode()
Другие вопросы по тегам