HttpClient 4 프록시 오류: http 프로토콜이 지원되지 않습니다
HTTPS 경로가 먼저 HTTP 프록시에 연결할 때 사용자 지정 Apache HttpClient 4 레지스트리에 일반 HTTP 팩토리를 남겨 두십시오.
Apache HttpClient 4 애플리케이션에서 HTTPS 대상이라고 해서 모든 연결이 TLS로 시작하는 것은 아닙니다. 일반 HTTP 프록시에는 평문 연결로 도달하며, 그다음 CONNECT가 터널을 열고 대상 쪽으로 TLS가 계층화됩니다.
사용자 지정 연결 관리자가 https만 등록하면 첫 프록시 홉이 UnsupportedSchemeException: http protocol is not supported 오류로 실패할 수 있습니다.
4.5 API에서는 해당 관리자를 구성할 때 두 팩토리를 모두 포함하십시오:
var registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", tlsFactory)
.build();
var manager = new PoolingHttpClientConnectionManager(registry);
var client = HttpClients.custom()
.setConnectionManager(manager)
.setProxy(new HttpHost("proxy.example.net", 8080, "http"))
.build();
tlsFactory는 애플리케이션의 기존 SSLConnectionSocketFactory이며, 의도된 신뢰 및 호스트 이름 검증을 포함합니다. 표시된 타입은 Apache 4의 org.apache.http 패키지에 속합니다. 이 조각은 Java의 지역 변수 타입 추론을 전제로 하며, 오래된 Java 소스는 명시적 타입을 사용할 수 있습니다.
수정한 관리자를 요청에 실제로 사용되는 클라이언트에 연결하십시오. 프록시 인증이 없는 허용된 공개 HTTPS 요청의 경우 HTTP 프록시 목록의 HTTP 항목으로 HttpHost의 프록시 주소를 채울 수 있습니다. 다른 빌더를 구성해도 이미 생성된 클라이언트는 갱신되지 않습니다.
빌더 소유권도 확인하십시오. HttpClientBuilder 문서에 따르면 명시적으로 제공된 연결 관리자는 별도의 SSL 구성 입력을 덮어쓸 수 있습니다. 나중의 setSSLContext 호출이 내부를 교체할 것이라고 가정하지 말고 필요한 팩토리를 관리자의 레지스트리에 넣으십시오.
이 진단은 로컬 스킴 레지스트리에 관한 것입니다. 프록시 인증 요구나 거부된 대상은 더 나중의 다른 결과입니다. 그러한 응답을 조사하는 동안 두 팩토리 등록을 모두 유지하십시오.