0

我有一个 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 中工作,这有帮助吗?

4

1 回答 1

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()
于 2020-04-04T01:47:33.723 回答