Java 和 squid 代理主机名解析

Java and squid proxy hostname resolution

我正在为 ftp 连接使用 squid 代理。在 squid 代理上,我们有基于主机名的规则,问题是 java 在本地进行主机名解析,然后将原始 IP 传递给代理。

所以示例代码:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(new InetSocketAddress("google.com", 21));
        

正在创建这样的请求:

CONNECT 172.217.23.142:21 HTTP/1.1
User-Agent: Java/14.0.1
Host: 172.217.23.142:21
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Proxy-Connection: keep-alive

所以 google.com 在 CONNECT 请求中已经转换为 172.217.23.142。有什么方法可以强制 java.net.Proxy 在打开与代理服务器的通信时使用主机名?

我们用于 ftps 连接的

JSch 库默认使用 ProxyHTTP class 执行此操作,我基本上需要与 java.net.Proxy.[=16= 相同]

Socket.connect中使用未解析套接字地址:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 9999));
Socket socket = new Socket(proxy);
socket.connect(InetSocketAddress.createUnresolved("google.com", 21));

connect 方法将使用已解析的 IP 地址。您可以在 implementation of HttpConnectSocketImpl:

中看到
    final InetSocketAddress epoint = (InetSocketAddress)endpoint;
    String destHost = epoint.isUnresolved() ? epoint.getHostName()
                                            : epoint.getAddress().getHostAddress();
    final int destPort = epoint.getPort();