2017-10-15 255 views
1

我使用OkHttp3在我的Android应用程序通过转发代理来进行HTTP/1.x的请求,我的后端服务器,就像这样:OkHttp3是否通过HTTP转发代理支持HTTP2?

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。但是,在我看来,OkHttp3只有在我们不通过HTTP代理时才能发出HTTP2请求。所以,上面的代码将无法工作。

换句话说,OkHttp3支持以下前三种情况,但不支持第四种情况。下面的HTTP/2意味着h2(HTTP/2 over TLS)而不是h2c(HTTP/2 over clear text)。

一个)客户端< - HTTP/1.x的 - >上游服务器

b)中的客户端< - HTTP/1.x的 - >转发代理< - HTTP/X - >上游服务器

c)中的客户端< - HTTP/2 - >上游服务器

d)客户端< - HTTP/2 - >转发代理< - HTTP/X - >上游服务器

有没有人否认或否认我的理解?谢谢。

回答

0

OkHttp将通过HTTP代理执行HTTP/2操作。由于OkHttp没有实现明文HTTP/2,因此您需要在服务器上使用HTTPS。

+0

杰西,我是一个SO新手,我有一个后续问题,无法在评论中表达干净 - 我不知道该怎么做。请看下一个答案。 – hoolam

0

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

... TLS:握手的libssl错误:错误:1407609B:SSL例程:SSL23_GET_CLIENT_HELLO:HTTPS代理请求

从我所收集,这个错误意味着okhttp3的代理代码是没有做TLS握手与转发代理。

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