我在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;上游服务器
有人确认或否认我的理解吗?感谢。
答案 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确实有意义,但通过转发代理不会。