【问题标题】:With a node HTTP2 push stream, what is the purpose of the request header vs. response header?对于节点 HTTP2 推送流,请求标头与响应标头的目的是什么?
【发布时间】:2020-08-29 06:11:54
【问题描述】:

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

服务器代码:

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 声明:

请求标头包含有关要获取的资源或请求资源的客户端的更多信息。

响应标头包含有关响应的附加信息,例如其位置或提供它的服务器。

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

【问题讨论】:

    标签: node.js http2


    【解决方案1】:

    所谓的“请求标头”映射到 HTTP/2 中的 PUSH_PROMISE 帧 (you can see this in the NodeJS source code)。

    PUSH_PROMISE 框架在 HTTP/2 spec 中定义,用于告诉客户端“嘿,我将假装您发送了此请求,然后向您发送对“虚假请求”的响应。

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2016-03-21
      • 2017-09-11
      • 2015-11-13
      • 1970-01-01
      相关资源
      最近更新 更多