我正在尝试使用Netty测试HTTP / 2推送承诺,但似乎无法正常工作。用例非常简单:
index.js
文件,因此我想为PUSH_PROMISE
index.js
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。
我做错了吗?
感谢。
答案 0 :(得分:2)
您的服务器正在发送PUSH_PROMISE,但它实际上从未发送数据以完成承诺的流。 PUSH_PROMISE合同是服务器对客户说“我想你将来会对这些数据发出请求,所以我已经在努力向你发送这些数据,而不是你必须提出请求。”请注意,当您未发送PUSH_PROMISE时,浏览器的行为会有所不同。在这种情况下,您至少会收到2个请求:
现在将此行为与服务器发送PUSH_PROMISE:
进行对比请注意,浏览器甚至没有请求“/assets/index.js”,因为您告诉浏览器您已预料到此请求并正在处理发送结果。因此,如果您在PUSH_PROMSIE之后发送“/assets/index.js”的数据,浏览器将会很高兴。