添加与 read_timeout 不同的整体上游响应头截止时间
作者: seonghobae创建于 2026年9月3日更新于 2026年9月3日
此问题解决了什么问题? Pingora 目前将 PeerOptions::read_timeout 当作每次读取的非活动超时时间进行暴露。这对于静默的上游来说是有用的,但它并不限制上游在每次单独的读取超时到期之前不断取得小量进展时,接收不完整响应头所花费的总时间。在当前的 main 提交 09696b51bc59315353d96686355861604d0bb48c 中,HTTP/1 客户端 HttpSession::read_response() 会将部分字节保存在 response_header_read_buf 中,然后将每个 underlying_stream.read_buf(...) 封装到一个新的 read_timeout 中。公共对等文档和 H1/H2 客户端字段都将 read_timeout 描述为在每次读取时重置,且明确不是整体响应持续时间超时。这意味着上游可以一次一个字节/片段地发送不完整的响应头,每个片段都在 read_timeout 内到达,并且可以不完成 \r\n\r\n 或违反非活动超时,而不停留请求。目前, ProxyHttp 应用程序无法可靠地实现此功能:upstream_response_filter 仅在响应头到达后才被调用,而体内容过滤则在稍后执行。total_connection_timeout 不能作为替代,因为它限制了连接建立(包括 TLS),而不是响应头阶段。
内容来源: cloudflare/pingora