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

Netty HTTP/2 writePushPromise使浏览器无限循环,netty,http2,push-promise,Netty,Http2,Push Promise,我试图用Netty测试HTTP/2推送承诺,但似乎不起作用。用例非常简单,如下所示: 请求主页/索引页 索引页面依赖于Index.js文件,因此我想为Index.js 写入并刷新索引页面的内容 以下是我所做的: int nextStreamId = encoder.connection().local().incrementAndGetNextStreamId(); String authority = request.headers().get("host"); Http2Headers pu

我试图用Netty测试HTTP/2推送承诺,但似乎不起作用。用例非常简单,如下所示:

  • 请求主页/索引页
  • 索引页面依赖于
    Index.js
    文件,因此我想为
    Index.js
  • 写入并刷新
    索引
    页面的内容
  • 以下是我所做的:

    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得到了正确的服务

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

    PUSH\u PROMISE
    的源代码是

    我做错什么了吗


    谢谢。

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

  • /
  • /资产/索引.js
  • [您的浏览器也可能请求/favicon.ico]
  • 现在将此行为与服务器发送推送承诺时进行对比:

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

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

    感谢您将代码发布到网上!使它非常容易理解和帮助!谢谢你的承诺错了!本以为浏览器在获得推送承诺时应该发出新请求。嗨,斯科特,我如何发送ask netty以处理
    新请求(我要推送的请求)?或者,我如何请求
    资产/index.js
    ,并确保执行了正确的处理程序或管道?例如,undertow或jetty自动执行此操作,只需使用其推送API即可。