【发布时间】:2019-10-02 21:18:39
【问题描述】:
我目前正在使用 Node.js 为动态和静态文件制作服务器。我正在尝试实现 HTTP2。让我吃惊的是,HTTP2 push 好像不支持 ETags!
当客户端发送标头以检索以推送开头并已接受的文件时,它会忽略“IF-NONE-MATCH”标头。
这是一种浪费,我不明白这种行为的原因。是这种情况还是我错过了什么?
【问题讨论】:
-
我认为您误解了它的工作原理。当您推送文件时,客户端不会发送任何标头,因为客户端不会请求该文件。服务器发送一个 PUSH_PROMISE 帧说“仅供参考,我将推送这个资源,就好像你这样要求它一样”,然后发送响应头和正文。所以不需要支持 ETag,因为没有客户端请求,所以 IF-NONE-MATCH 可以匹配。
-
我明白,我对服务器发送的标头感到困惑。尽管如此,在我看来,发送已经在客户端中的信息是一种浪费带宽。据我了解,客户端有两次拒绝推送的机会,第一次拒绝promise,然后发送一个帧RST_STREAM。没有机制可以避免这种行为,而是利用推送的潜力?
-
我已经在下面给出了详细的答案。请注意,拒绝 PUSH_PROMISE 是通过 RST_STREAM 完成的,因此只有一种拒绝推送的方法,而不是您建议的两种。