2017-10-15 21 views
1

私はそうのように、フォワードプロキシを経由して私のバックエンドサーバーへのHTTP/1.xの要求を行うために私のAndroidアプリにOkHttp3使用しています: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は、以下の最初の3つのケースをサポートしますが、4番目のケースはサポートしません。以下のHTTP/2は、h2c(HTTP/2クリアテキスト以上)ではなくh2(TLS上のHTTP/2)を意味します。

A)クライアント< - HTTP/1.1 - >上流のサーバ

B)クライアント< - HTTP/1.1 - >フォワードプロキシ< - HTTP/X - >上流サーバ

C)クライアント< - HTTP/2 - >上流のサーバ

D)クライアント< - HTTP/2 - >フォワードプロキシ< - HTTP/X - >上流のサーバ

否定するか、私の理解を否定するか?ありがとう。

答えて

0

OkHttpはHTTPプロキシを介してHTTP/2を行います。 OkHttpは平文HTTP/2を実装していないので、サーバー上にHTTPSが必要です。

+0

私はSOの初心者であり、私はコメントできれいに表現することができないフォローアップの質問を持っています - 私は方法を知らない。次の答えを見てください。 – hoolam

0

Jesse、TLSでHTTP2をサポートするnghttp2のフォワードプロキシnghttpx経由でProxy.Type.HTTPでhttps://www.google.com/を取得しようとしました。残念ながら、TLSハンドシェイクは発生せず、フォワードプロキシは次のエラーを報告しました。

... TLS:ハンドシェイクのlibsslエラー:エラー:1407609B:SSLルーチン:SSL23_GET_CLIENT_HELLO:私が集まる何からのHTTPSプロキシ要求

、このエラーはokhttp3のプロキシコードは、フォワードプロキシとのTLSハンドシェイクを行っていないことを意味します。

これは、フォワードプロキシ経由のHTTP2は、転送プロキシが暗号化された要求に値を追加できないため、無意味であると考えています。フォワードプロキシは単にパススルーパイプです。実際、私は、転送プロキシ経由のTLSは無意味だと思います。エンドツーエンドのHTTP2 over TLSは理にかなっていますが、フォワードプロキシ経由では意味がありません。

関連する問題