Python Ответ потока Quart / Hypercorn, вызывающий net :: ERR_HTTP2_PROTOCOL_ERROR 200 - PullRequest
0 голосов
/ 20 марта 2020

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

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

в файле config.py для hypercorn:

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 Ответ

0 голосов
/ 04 апреля 2020

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

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()
...