Netty HTTP/2 writePushPromise 让浏览器无限循环
Netty HTTP/2 writePushPromise makes browser to loop indefinitely
我正在尝试使用 Netty 测试 HTTP/2 推送承诺,但似乎不起作用。用例很简单:
- 请求home/index页面
- 索引页取决于
index.js
文件,所以我想为 index.js
发送 PUSH_PROMISE
- 为
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。
我是不是做错了什么?
谢谢。
您的服务器正在发送一个 PUSH_PROMISE 但它实际上从未发送数据来完成承诺的流。 PUSH_PROMISE 合同是服务器对客户端说 "I think you will make a request for this data in the future, so instead of you having to make a request I am already working on sending you this data"。当您不发送 PUSH_PROMISE 时,请注意浏览器行为的差异。在这种情况下,您至少会收到 2 个请求:
- /
- /assets/index.js
- [您的浏览器可能还会请求 /favicon.ico]
现在将此行为与您的服务器发送 PUSH_PROMISE:
- /
- [您的浏览器可能还会请求 /favicon.ico]
请注意浏览器甚至不请求“/assets/index.js”,因为您告诉浏览器您已经预料到该请求并且正在发送结果。因此,如果您在 PUSH_PROMSIE 之后发送“/assets/index.js”的数据,浏览器会很高兴。
我正在尝试使用 Netty 测试 HTTP/2 推送承诺,但似乎不起作用。用例很简单:
- 请求home/index页面
- 索引页取决于
index.js
文件,所以我想为index.js
发送 - 为
index
页面写入和刷新内容。
PUSH_PROMISE
这是我所做的:
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。
我是不是做错了什么?
谢谢。
您的服务器正在发送一个 PUSH_PROMISE 但它实际上从未发送数据来完成承诺的流。 PUSH_PROMISE 合同是服务器对客户端说 "I think you will make a request for this data in the future, so instead of you having to make a request I am already working on sending you this data"。当您不发送 PUSH_PROMISE 时,请注意浏览器行为的差异。在这种情况下,您至少会收到 2 个请求:
- /
- /assets/index.js
- [您的浏览器可能还会请求 /favicon.ico]
现在将此行为与您的服务器发送 PUSH_PROMISE:
- /
- [您的浏览器可能还会请求 /favicon.ico]
请注意浏览器甚至不请求“/assets/index.js”,因为您告诉浏览器您已经预料到该请求并且正在发送结果。因此,如果您在 PUSH_PROMSIE 之后发送“/assets/index.js”的数据,浏览器会很高兴。