OkHttp3是否通过HTTP转发代理支持HTTP2?

时间:2017-10-15 23:54:57

标签: java okhttp okhttp3

我在Android应用中使用OkHttp3通过转发代理向我的后端服务器发出HTTP / 1.x请求,如下所示:

List<Protocol> protos = new ArrayList<>();
protos.add(Protocol.HTTP_2);
protos.add(Protocol.HTTP_1_1);
InetSocketAddress proxyAddr = new InetSocketAddress("proxy.example.com", 80);
Proxy proxy = new Proxy(Proxy.Type.HTTP, proxyAddr);
OkHttpClient cli = new OkHttpClient.Builder()
    .proxy(proxy)
    .protocols(protos)
    .build();
String url = "http://www.example.com/";
Request req = new Request.Builder().url(url).build();
Response res = cli.newCall(req).execute();

我想升级到HTTP2。但是,在我看来,只有当我们不通过HTTP代理时,OkHttp3才能发出HTTP2请求。所以,上面的代码不起作用。

换句话说,OkHttp3支持下面的前3个案例但不支持第4个案例。下面的HTTP / 2表示h2(HTTP / 2 over TLS)而不是h2c(HTTP / 2而不是明文)。

a)客户&lt; - HTTP / 1.x - &gt;上游服务器

b)客户&lt; - HTTP / 1.x - &gt;转发代理&lt; - HTTP / x - &gt;上游服务器

c)客户&lt; - HTTP / 2 - &gt;上游服务器

d)客户&lt; - HTTP / 2 - &gt;转发代理&lt; - HTTP / x - &gt;上游服务器

有人确认或否认我的理解吗?感谢。

2 个答案:

答案 0 :(得分:0)

OkHttp将通过HTTP代理执行HTTP / 2。因为OkHttp没有实现明文HTTP / 2,所以你需要在服务器上使用HTTPS。

答案 1 :(得分:0)

Jesse,我尝试通过nghttp2的转发代理nghttpx通过Proxy.Type.HTTP检索https://www.google.com/,它支持HTTP上的TLS。不幸的是,TLS握手没有发生,转发代理报告了以下错误。

... tls:handshake libssl error:error:1407609B:SSL例程:SSL23_GET_CLIENT_HELLO:https代理请求

从我收集的内容来看,这个错误意味着okhttp3的代理代码没有与转发代理进行TLS握手。

这让我觉得通过转发代理通过TLS的HTTP2是没有意义的,因为转发代理将无法向加密请求添加任何值 - 转发代理只是一个传递管道。事实上,我认为通过任何转发代理的TLS都是毫无意义的。通过TLS的端到端HTTP2确实有意义,但通过转发代理不会。