Apache Commons Net menyertakan FTPHTTPClient untuk FTP melalui proxy HTTP CONNECT. Fitur bergunanya bukan sekadar menjangkau port login FTP: ia juga membangun terowongan proxy untuk koneksi data pasif yang digunakan oleh daftar dan transfer berkas.

Konstruktor menerima titik akhir proxy dan kredensial proxy opsional. Server FTP tetap menjadi argumen connect, dan login menerima akun FTP:

FTPHTTPClient ftp = new FTPHTTPClient(
    "proxy.example.net", 8080, proxyUser, proxyPassword
);

try {
    ftp.connect("ftp.example.net", 21);
    if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
        throw new IOException(ftp.getReplyString());
    }
    if (!ftp.login(ftpUser, ftpPassword)) {
        throw new IOException(ftp.getReplyString());
    }

    ftp.enterLocalPassiveMode();
    if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)
            || !ftp.retrieveFile(remoteFile, output)) {
        throw new IOException(ftp.getReplyString());
    }
    ftp.logout();
} finally {
    if (ftp.isConnected()) {
        ftp.disconnect();
    }
}

Fragmen transfer ini mengasumsikan impor FTP Commons Net, java.io.IOException, variabel kredensial yang disediakan aplikasi, dan aliran keluaran milik pemanggil. remoteFile adalah nama berkas yang dimaksud di sisi server. Aplikasi juga harus menutup aliran keluarannya pada titik yang tepat.

Atur mode pasif setelah terhubung dan sebelum operasi data. Implementasi FTPHTTPClient menolak koneksi data dalam mode aktif. Dalam mode pasif, ia menegosiasikan titik akhir data dengan FTP dan membuka koneksi lain ke proxy HTTP, lalu meminta terowongan CONNECT ke titik akhir tersebut.

Terowongan kedua itu menjelaskan batas yang umum: izin proxy untuk port kontrol FTP tidak cukup. Tujuan dan port yang diizinkan harus mencakup titik akhir data pasif server. Salam dan login yang berhasil hanya membuktikan bahwa jalur kontrol berfungsi.

Implementasi menyediakan autentikasi proxy Basic saat nama pengguna dan kata sandi proxy sama-sama ada. Itu berbeda dari pertukaran FTP USER/PASS. Proxy yang memerlukan mekanisme autentikasi lain membutuhkan konektor yang kompatibel; konstruktor tidak menyediakan setiap skema.

Commons Net mendokumentasikan kelas ini sebagai eksperimental, jadi evaluasikan terhadap kebutuhan aplikasi dan proxy sebelum mengadopsinya. Ini klien FTP, bukan klien FTPS atau SFTP. Untuk FTPS dengan layanan SOCKS tersedia, antarmuka socket-proxy FTPSClient adalah jalur klien terpisah. CONNECT menyediakan rute dan tidak dengan sendirinya mengenkripsi kredensial FTP atau isi berkas.

Jaga galat tetap terkait dengan tahap yang menghasilkannya: penolakan HTTP saat penyiapan terowongan, penolakan login FTP, atau kegagalan transfer FTP/data. Mengganti kata sandi FTP tidak dapat menyelesaikan kebijakan proxy yang menolak port data pasif.

Artikel terkait