我正在使用 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();
答案 0 :(得分:0)
缺少标头的原因是CONNECT请求,该请求建立了TCP隧道,而不是向代理发送HTTP请求。
但不幸的是
https://github.com/netty/netty/issues/8269
和
https://github.com/spring-projects/spring-framework/issues/21767
Web客户端对每种类型的代理发出CONNECT请求所使用的基础Netty客户端,并且不会更改。