作为客户端,仅使用标准 Java 库,如何在事先知道将使用该协议版本的情况下建立不安全的HTTP/2 连接?即不首先通过 HTTP/1.1 发送升级请求。
我尝试过使用 中的实用程序java.net.http,调用version(HttpClient.Version.HTTP_2)请求和客户端构建器,但是初始请求始终通过 HTTP/1.1 发送,并带有升级标头。到目前为止,从一开始就强制使用版本 2 的唯一方法似乎是使用 https 上的安全连接(我想避免这种情况)。
我还想坚持只使用 OpenJDK 11 中包含的类(没有 netty 等)。
恐怕这在 Java 11 http 客户端 API 中似乎不可能。
最相关的内部 JDK 类是Http2Connection.java。它列出了我们期望的 HTTP/2 连接的三种“创建”情况:
我们对案例 2 感兴趣。有这样的代码:
/**
* Cases 2) 3)
*
* request is request to be sent.
*/
private Http2Connection(HttpRequestImpl request,
Http2ClientImpl h2client,
HttpConnection connection)
throws IOException
{
...
}
Run Code Online (Sandbox Code Playgroud)
唉,这个构造函数实际上仅在安全连接的方法中使用:
// Requires TLS handshake. So, is really async
static CompletableFuture<Http2Connection> createAsync(HttpRequestImpl request,
Http2ClientImpl h2client,
Exchange<?> exchange) {
assert request.secure();
AbstractAsyncSSLConnection connection = (AbstractAsyncSSLConnection)
...
return connection.connectAsync(exchange)
.thenCompose(unused -> connection.finishConnect())
.thenCompose(unused -> checkSSLConfig(connection))
.thenCompose(notused-> {
CompletableFuture<Http2Connection> cf = new MinimalFuture<>();
try {
Http2Connection hc = new Http2Connection(request, h2client, connection);
cf.complete(hc);
} catch (IOException e) {
cf.completeExceptionally(e);
}
return cf; } );
Run Code Online (Sandbox Code Playgroud)
非 TLS 构造函数似乎仅在升级 HTTP 1.1 连接时才会被调用。
我也研究了许多其他课程。我看不到任何表明 JDK 11 客户端中无需从 HTTP 1.1 升级即可协商明文 HTTP/2 连接的信息。
我发现的内容与HttpClient.Builder的 javadoc 中的 API 描述非常匹配,其中仅说明了有关选择 HTTP/2 作为版本的信息:
如果设置为 HTTP/2,则每个请求都会尝试升级到 HTTP/2。如果升级成功,则对此请求的响应将使用 HTTP/2,并且对同一源服务器的所有后续请求和响应都将使用 HTTP/2。如果升级失败,则将使用 HTTP/1.1 处理响应
HTTP/2 连接重用中发生了很多有趣的事情。例如,在升级并发请求的情况下,仅保留一个请求以供将来在 HTTP/2 连接“缓存”中使用。当流的数量达到最大值(约 2^31-1)时,缓存的连接将过期,这样进一步的请求就不会超过它,但现有的流将保持打开状态。这是很多流。我认为,如果您的用例与我的一样(长时间运行的应用程序中的 Web 服务客户端),那么实际上仅针对第一个请求的升级成本可以忽略不计。我仍然想消除它,主要是为了简单起见,但我开始认为这是不值得的。
就像提问者一样,我想坚持使用 JDK 客户端。我只想提到 Apache HttpClient 5 beta 似乎支持强制 HTTP/2 (HttpVersionPolicy.FORCE_HTTP_2)。我无法对此提供更多建议,因为 Beta 版没有太多文档,而且注释比 JDK 实现要少得多。但如果我尝试并成功,我会更新我的答案。
| 归档时间: |
|
| 查看次数: |
1845 次 |
| 最近记录: |