Потоковый ответ 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()