2017-10-15 3 views
1

그래서처럼 앞으로 프록시를 통해 내 백엔드 서버로 HTTP/1.x에서 요청을 내 안드로이드 응용 프로그램에서 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 가지 경우를 지원하지만 네 번째는 지원하지 않습니다. 아래의 HTTP/2는 h2c (HTTP/2 일반 텍스트 이상)가 아닌 h2 (TLS를 통한 HTTP/2)를 의미합니다.

a) 클라이언트 < - 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

제시, 나는 초보자이며 주석에 깔끔하게 표현할 수없는 후속 질문이 있습니다. 어떻게해야할지 모르겠군요. 다음 답을 참조하십시오. – 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 핸드 쉐이킹을 수행되지 않음을 의미합니다 .

이렇게하면 포워드 프록시가 암호화 된 요청에 어떤 값도 추가 할 수 없으므로 포워드 프록시를 통한 TLS를 통한 HTTP2가 무의미하다고 생각하게됩니다. 포워드 프록시는 통과 파이프입니다. 사실, 전방 프록시를 통한 TLS는 무의미하다고 생각합니다. TLS를 통한 종단 간 HTTP2는 의미가 있지만 정방향 프록시를 통한 것은 아닙니다.

관련 문제