Netty HTTP/2 writePushPromise 让浏览器无限循环

Netty HTTP/2 writePushPromise makes browser to loop indefinitely

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

  1. 请求home/index页面
  2. 索引页取决于 index.js 文件,所以我想为 index.js
  3. 发送 PUSH_PROMISE
  4. 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 时才会发生这种情况,如果我删除这些行,一切正常,并且两个文件 (HTML+js) 都可以通过 H2 正确提供。

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

PUSH_PROMISE 的源代码是 here

我是不是做错了什么?

谢谢。

您的服务器正在发送一个 PUSH_PROMISE 但它实际上从未发送数据来完成承诺的流。 PUSH_PROMISE 合同是服务器对客户端说 "I think you will make a request for this data in the future, so instead of you having to make a request I am already working on sending you this data"。当您不发送 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”的数据,浏览器会很高兴。