带有代理服务器的Spring WebClient:缺少HTTP标头

时间:2019-02-26 21:18:44

标签: proxy http-headers spring-webflux reactor-netty

我正在使用 spring-boot-starter-webflux 2.1.3RELEASE 中的Spring WebClient来检查代理服务器的匿名级别。通过某些代理服务器向WebClient发出一些请求后,请求中没有与代理相关的HTTP标头。我想念例如x-forwarded-for, via, x-proxy-id ..仅露出remote-address

据我了解,对于每种代理类型(HTTP,SOCKS4 / 5),netty客户端都通过tcp CONNECT连接到代理,这就是缺少标头的原因。

问题: 是否可以通过这种方法获取经典的代理HTTP标头,或者是否可以通过WebClient配置代理服务器?

我的示例配置:

HttpClient httpClient = HttpClient.create()
    .tcpConfiguration(tcpClient ->
        tcpClient
            .proxy(proxy -> {                       
                proxy.type(ProxyProvider.Proxy.HTTP).address(new InetSocketAddress(ip, port));})
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
            .doOnConnected(connection ->
                connection
                    .addHandlerLast(new ReadTimeoutHandler(10000))
                    .addHandlerLast(new WriteTimeoutHandler(10000))));

ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient);

WebClient build = WebClient.builder()
    .baseUrl(baseUrl)
    .clientConnector(connector)
    .build();

1 个答案:

答案 0 :(得分:0)

缺少标头的原因是CONNECT请求,该请求建立了TCP隧道,而不是向代理发送HTTP请求。

但不幸的是

https://github.com/netty/netty/issues/8269

https://github.com/spring-projects/spring-framework/issues/21767

Web客户端对每种类型的代理发出CONNECT请求所使用的基础Netty客户端,并且不会更改。