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 请求,这不会更改。
我正在使用 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 请求,这不会更改。