1

我正在为 HTTP/2 编写一个弹性客户端。我想知道客户端的行为应该是什么,如果服务器发送了一个 PUSH_PROMISE 然后未能发送与该 PUSH_PROMISE 相关的 PUSH_RESPONSE ?

我浏览了关于Push Response的 HTTP/2 规范,但它没有说明在这种情况下我们应该做什么。

  • 如果没有收到推送响应,我们是否应该再次发送原始请求?如果原始请求发送成功,再次发送可能会导致问题,不是吗?
  • 还是我们应该忽略 PUSH_PROMISE 并继续?在这种情况下,假设服务器承诺发送文件,但没有发送,会发生什么?

有没有明确的方法来解决这个问题?

4

2 回答 2

1

客户端当然可以自由地再次请求相同的资源。例如,考虑到当服务器发送PUSH_PROMISE.

Client                  Server
------                  ------
HEADERS[sid:1, GET /]
                         HEADERS[sid:1, /], DATA [sid:1], PUSH_PROMISE[sid:2]
HEADERS[sid:3, GET /css] HEADERS[sid:2, /css], DATA[sid:2]
                         HEADERS[sid:3, /css], DATA[sid:3]


客户端取消推送的标准方法是通过RST_STREAM.

于 2019-05-10T04:20:27.003 回答
-1

PUSH PROMISE - 所有服务器推送流都是通过 PUSH-PROMISE 帧启动的,这表明服务器打算将描述的资源推送到客户端,并且需要在请求推送资源的响应数据之前交付。满足此要求的最简单策略是在父响应之前发送所有 PUSH-PROMISE 帧,其中仅包含承诺资源的 HTTP 标头。

PUSH_PROMISE用于应用 HTTP/2 服务器推送的方法,因为服务器会PUSH_PROMISE为正常浏览器启动的流的响应部分创建帧。具有 HTTP 连接的请求上下文的响应对象用于服务器推送。例如,在具有HTTP连接的应用程序的Page_load方法下,可以用于申请Response.PUSHPROMISE推送所有相关的脚本、样式和图像,而无需客户端显式请求每一个

于 2019-11-20T07:15:46.390 回答