Python Quart / Hypercorn流式响应导致net :: ERR_HTTP2_PROTOCOL_ERROR 200

时间:2020-03-20 20:38:34

标签: python nginx cloudflare quart hypercorn

我有一个Quart应用程序,可通过该应用程序将响应流回客户端。我使用asyncio.sleep延迟响应完成,如果我将延迟设置为59秒,则一切正常。流完成没有任何问题。如果我将时间增加到120秒,则响应似乎超时。那是客户端接收到流的第一部分,但是大约60秒后,浏览器在Chrome中抛出一个错误:net :: ERR_HTTP2_PROTOCOL_ERROR200。Firefox抛出了TypeError。

我在Nginx上使用Hypercorn。

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引起的。看到这个答案: What's the net::ERR_HTTP2_PROTOCOL_ERROR about?

然后的问题是,如何在Cloudlfare中更改它。

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

1 个答案:

答案 0 :(得分:0)

我发现的唯一解决方案是中断睡眠并向客户端发送临时数据,以保持连接畅通。

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