Python Quart/HHypercorn流式响应导致net::ERR_HTTP2_PROTOCOL_ERROR 2



我有一个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引起的。请参阅以下答案:什么';网络::ERR_HTTP2_PROTOCOL_ERROR是关于什么的?

那么问题是,如何在Cloudlfare中改变这一点。

我没有将Quart配置为在http2中工作,这会有帮助吗?

我找到的唯一解决方案是中断睡眠并向客户端发送临时数据,以保持连接的有效性。

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

最新更新