2017-10-15 4 views
1

Ich verwende in meinem Android App OkHttp3 zu HTTP/1.x Anfragen an meine Backend-Server über einen Forward-Proxy, wie so zu machen:Unterstützt OkHttp3 HTTP2 über einen HTTP-Forward-Proxy?

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(); 

Ich möchte ein Upgrade auf HTTP2. Es scheint mir jedoch, dass OkHttp3 HTTP2-Anfragen nur stellen kann, wenn wir nicht über einen HTTP-Proxy gehen. Also, der obige Code würde nicht funktionieren.

Mit anderen Worten, OkHttp3 unterstützt die ersten 3 Fälle, aber nicht die vierte. HTTP/2 unten bedeutet h2 (HTTP/2 über TLS) nicht h2c (HTTP/2 über Klartext).

a) Client < - HTTP/1.x -> Upstream-Server

b) -Client < - HTTP/1.x -> Forward-Proxy < - HTTP/x -> Upstream Server

c) -Client < - HTTP/2 -> Upstream-Server

d) -Client < - HTTP/2 -> Forward-Proxy < - HTTP/x -> Upstream-Server

Hat jemand co nfirm oder verleugne mein Verständnis? Vielen Dank.

Antwort

0

OkHttp wird HTTP/2 über einen HTTP-Proxy ausführen. Sie benötigen HTTPS auf dem Server, da OkHttp den Klartext HTTP/2 nicht implementiert.

+0

Jesse, ich bin ein SO-Neuling und ich habe eine Follow-up-Frage, die ich in einem Kommentar nicht sauber ausdrücken kann - ich weiß nicht, wie. Bitte sehen Sie die nächste Antwort. – hoolam

0

Jesse, Ich versuchte mit Proxy.Type.HTTP über Nghttp2 Vorwärts Proxy nghttpx, die HTTP2 über TLS unterstützt. Leider ist kein TLS-Handshake erfolgt und der Forward-Proxy hat den folgenden Fehler gemeldet.

... tls: Händedruck libssl Fehler: Fehler: 1407609B: SSL-Routinen: SSL23_GET_CLIENT_HELLO: https Proxy-Anforderung

Von dem, was ich sammeln, bedeutet dieser Fehler, dass Proxy-Code des okhttp3 tut TLS Handshake nicht mit dem Forward-Proxy .

Das lässt mich denken, dass HTTP2 über TLS über einen Forward-Proxy sinnlos ist, weil der Forward-Proxy verschlüsselten Anfragen keinen Wert hinzufügen kann - der Forward-Proxy ist nur eine Pass-Through-Pipe. Tatsächlich denke ich, TLS über einen Forward Proxy ist sinnlos. End-to-End-HTTP2 über TLS ist zwar sinnvoll, aber nicht über einen Forward-Proxy.