Netty HTTP/2 writePushPromise使浏览器无限循环
我试图用Netty测试HTTP/2推送承诺,但似乎不起作用。用例非常简单,如下所示: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
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个请求:
请注意,浏览器甚至没有请求“/assets/index.js”,因为您告诉浏览器您已经预料到了这个请求,并且正在努力发送结果。因此,如果您在推送后发送“/assets/index.js”的数据,浏览器会很高兴。感谢您将代码发布到网上!使它非常容易理解和帮助!谢谢你的承诺错了!本以为浏览器在获得推送承诺时应该发出新请求。嗨,斯科特,我如何发送ask netty以处理
新请求(我要推送的请求)?或者,我如何请求资产/index.js
,并确保执行了正确的处理程序或管道?例如,undertow或jetty自动执行此操作,只需使用其推送API即可。