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

时间:2016-08-10 14:41:35

标签: netty http2 push-promise

我正在尝试使用Netty测试HTTP / 2推送承诺,但似乎无法正常工作。用例非常简单:

  1. 请求主页/索引页
  2. 索引页面取决于index.js文件,因此我想为PUSH_PROMISE
  3. 发送index.js
  4. index页面撰写和刷新内容。
  5. 这是我做的:

    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

    我做错了吗?

    感谢。

1 个答案:

答案 0 :(得分:2)

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

  1. /
  2. /assets/index.js
  3. [您的浏览器也可以请求/favicon.ico]
  4. 现在将此行为与服务器发送PUSH_PROMISE:

    进行对比
    1. /
    2. [您的浏览器也可以请求/favicon.ico]
    3. 请注意,浏览器甚至没有请求“/assets/index.js”,因为您告诉浏览器您已预料到此请求并正在处理发送结果。因此,如果您在PUSH_PROMSIE之后发送“/assets/index.js”的数据,浏览器将会很高兴。

相关问题