2

我正在尝试使用 Netty 测试 HTTP/2 推送承诺,但似乎不起作用。用例很简单:

  1. 请求主页/索引页面
  2. 索引页面取决于一个index.js文件,所以我想发送PUSH_PROMISE一个index.js
  3. index为页面写入和刷新内容。

这是我所做的:

int nextStreamId = encoder.connection().local().incrementAndGetNextStreamId();
String authority = request.headers().get("host");
Http2Headers pushHeaders = new DefaultHttp2Headers()
    .method("GET")
    .path("/assets/index.js")
    .authority(authority)
    .scheme("https");

encoder.writePushPromise(ctx, Integer.parseInt(streamId), nextStreamId, pushHeaders, 0, ctx.newPromise());

它成功地向PUSH_PROMISE浏览器发送了一个,但是/assets/index.js文件根本没有加载(浏览器无限期地等待响应)

这仅在我发送PUSH_PROMISE.

此处提供了完整的演示(它使用自签名证书,因此您必须接受不安全警告)

的源代码PUSH_PROMISE这里

难道我做错了什么?

谢谢。

4

1 回答 1

2

您的服务器正在发送 PUSH_PROMISE 但它实际上从未发送数据以完成承诺的流。PUSH_PROMISE 合约是服务器对客户端说“我认为您将来会请求此数据,因此您不必提出请求,我已经在努力向您发送此数据”。请注意当您不发送 PUSH_PROMISE 时浏览器行为的差异。在这种情况下,您至少会收到 2 个请求:

  1. /
  2. /assets/index.js
  3. [您的浏览器也可能请求 /favicon.ico]

现在将此行为与您的服务器发送 PUSH_PROMISE 时进行对比:

  1. /
  2. [您的浏览器也可能请求 /favicon.ico]

请注意,浏览器甚至没有请求“/assets/index.js”,因为您告诉浏览器您已经预料到了这个请求并且正在发送结果。因此,如果您在 PUSH_PROMSIE 之后发送“/assets/index.js”的数据,浏览器会很高兴。

于 2016-08-11T07:22:46.900 回答