【问题标题】:Netty HTTP/2 writePushPromise makes browser to loop indefinitelyNetty HTTP/2 writePushPromise 使浏览器无限循环
【发布时间】:2016-08-11 15:22:46
【问题描述】:

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

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

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

PUSH_PROMISE的源代码是here

我是不是做错了什么?

谢谢。

【问题讨论】:

  • 感谢您在线发布代码!让它很容易理解和帮助!

标签: netty http2 push-promise


【解决方案1】:

您的服务器正在发送一个 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”的数据,浏览器会很高兴。

【讨论】:

  • 谢谢! PUSH_PROMISE 出错了!认为浏览器应该在收到 PUSH_PROMISE 时发出新请求。
  • 嗨 Scott,我如何发送 ask netty 来处理new request(我要推送的那个)?或者我如何提出assets/index.js 的请求并确保执行正确的处理程序或管道?例如 undertow 或 jetty 会自动执行此操作,只需要使用它们的 PUSH API。
猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
相关资源
最近更新 更多