Saya menggunakan proxy squid untuk koneksi ftp. Pada proxy squid kami memiliki aturan berdasarkan nama host dan masalahnya adalah bahwa Java melakukan resolusi nama host secara lokal dan kemudian meneruskan IP mentah ke proxy.

Jadi contoh kode:

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));
        

Sedang membuat permintaan seperti ini:

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

Jadi google.com sudah diterjemahkan ke 172.217.23.142 dalam permintaan CONNECT. Apakah ada cara untuk memaksa Java.net.Proxy menggunakan nama host saat membuka komunikasi dengan server proxy?

JSch lib yang kami gunakan untuk koneksi ftps melakukan ini secara default dengan kelas ProxyHTTP dan pada dasarnya saya membutuhkan hal yang sama dengan java.net.Proxy.

1
Mihael Mamula 6 Juli 2020, 18:13

1 menjawab

Jawaban Terbaik

Gunakan alamat soket belum terselesaikan di 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));

Metode connect akan menggunakan alamat IP jika sudah diselesaikan. Anda dapat melihat ini di implementasi HttpConnectSocketImpl:

    final InetSocketAddress epoint = (InetSocketAddress)endpoint;
    String destHost = epoint.isUnresolved() ? epoint.getHostName()
                                            : epoint.getAddress().getHostAddress();
    final int destPort = epoint.getPort();
0
Joni 6 Juli 2020, 15:34