http2 规范说:
接收者必须将在既不是“打开”也不是“半关闭(本地)”的流上接收到 PUSH_PROMISE 视为 PROTOCOL_ERROR 类型的连接错误(第 5.4.1 节)。但是,在相关流上发送 RST_STREAM 的端点必须处理可能在接收和处理 RST_STREAM 帧之前创建的 PUSH_PROMISE 帧。
规范也有这个生命周期图。
我的理解是,为了让客户端PUSH_PROMISE
在流上接收 a,客户端必须在该流上拥有所有这些:
- 将
HEADERS
帧(+ anyCONTINUATION
s)发送到服务器 - 未收到
END_STREAM
来自服务器的标志 - 未收到
RST_STREAM
来自服务器的帧
(这里值得注意的是“未将RST_STREAM
帧发送到服务器”,这将导致流被“关闭”;上面的引用说这不是连接错误的理由。)
在不满足这些条件的任何情况下,客户端必须将接收到 PUSH_PROMISE 视为连接错误。
这是一个正确的理解吗?