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

Spring WebClient with proxy server: Missing HTTP headers

我正在使用 spring-boot-starter-webflux 2.1.3.RELEASE 中的 Spring WebClient 检查代理服务器的匿名级别。在我通过一些代理服务器使用 WebClient 向自定义 node.js http 服务器发出一些请求后,我的请求中没有与代理相关的 HTTP headers。我失踪了x-forwarded-for, via, x-proxy-id.. 只是暴露了 remote-address

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

问题: 有没有一种方法可以通过这种方法获得经典代理 HTTP headers,或者是否有另一种方法可以使用 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();

预计headers

{"user-agent":"ReactorNetty/0.8.4.RELEASE","host":"21X.8X.XX.145:8XX","accept":"*/*","x-proxy-id":"719306848","x-forwarded-for":"21X.8X.XX.145","via":"1.1 101.XX.8X.11X (Mikrotik HttpProxy)"} 

实际headers

{"user-agent":"ReactorNetty/0.8.4.RELEASE","host":"21X.8X.XX.145:8XX","accept":"*/*"}

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

但不幸的是

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

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

网络客户端使用的底层 netty 客户端为每种类型的代理发出 CONNECT 请求,这不会更改。