对于节点 HTTP2 推送流,请求 header 与响应 header 的目的是什么?

With a node HTTP2 push stream, what is the purpose of the request header vs. response header?

当节点 HTTP2 服务器创建新的推送流时,请求 header 与响应 header 的目的是什么?

服务器代码:

http2Server.on('stream', (stream) => {
  stream.pushStream({ ':path': '/' }, (err, pushStream, headers) => { // send request headers
    pushStream.respond({ ':status': 200 });                           // send response headers
    pushStream.end('some pushed data');
  });
  stream.end('some data');
});

客户代码:

clientHttp2Session.on('stream', (pushedStream, requestHeaders) => { // receive request headers
  pushedStream.on('push', (responseHeaders) => {                    // receive response headers
    /* Process response headers */
  });
  pushedStream.on('data', (chunk) => { /* handle pushed data */ });
});

这两个都必须在发送任何数据之前发送,所以其中一个似乎是多余的?

MDN 声明:

Request headers contain more information about the resource to be fetched, or about the client requesting the resource.

Response headers hold additional information about the response, like its location or about the server providing it.

但是,这似乎更倾向于客户端请求、服务器响应模型——不适用于推送。

您所说的“请求 header”映射到 PUSH_PROMISE frame in HTTP/2 (you can see this in the NodeJS source code)。

PUSH_PROMISE 框架在 HTTP/2 spec 中定义,用于告诉客户端“嘿,我要假装你发送了这个请求,并向你发送响应'fake request'下一个。

它用于通知客户端此响应正在进行中,如果它需要它,则无需再为它发出另一个请求。

它还允许客户端使用 RST_STREAM 帧取消此推送请求,以说“不,谢谢,我不想要那个。”这可能是因为服务器正在推送客户端缓存中已有的资源或出于其他原因。