我需要连接到一个读取CONNECT请求中标头的代理。我的意思是在切换到HTTPS加密流之前,随CONNECT一起传递的标头。

HttpClient有可能吗?它的默认行为似乎是通过加密流推送所有标头。

最佳答案

我不确定您应该这样做(我个人没有看到将自定义标头添加到CONNECT请求的正当理由),但是这可以通过HttpClient 4.3或更高版本来完成

class MyHttpClientBuilder extends HttpClientBuilder {

    @Override
    protected ClientExecChain createMainExec(
            final HttpRequestExecutor requestExec,
            final HttpClientConnectionManager connManager,
            final ConnectionReuseStrategy reuseStrategy,
            final ConnectionKeepAliveStrategy keepAliveStrategy,
            final HttpProcessor proxyHttpProcessor,
            final AuthenticationStrategy targetAuthStrategy,
            final AuthenticationStrategy proxyAuthStrategy,
            final UserTokenHandler userTokenHandler) {

        final HttpProcessor myProxyHttpProcessor = new ImmutableHttpProcessor(new RequestTargetHost(), new HttpRequestInterceptor() {
            @Override
            public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
                request.addHeader("Hello", "Mom says hi");
            }
        });

        return super.createMainExec(requestExec, connManager, reuseStrategy, keepAliveStrategy,
                myProxyHttpProcessor, targetAuthStrategy, proxyAuthStrategy, userTokenHandler);
    }
}

HttpClientBuilder httpClientBuilder = new MyHttpClientBuilder();
CloseableHttpClient client = MyHttpClientBuilder.build();

08-04 15:38