Apache Commons Net містить FTPHTTPClient для роботи з FTP через HTTP CONNECT-проксі. Його корисна властивість не лише в досягненні порту входу FTP: він також встановлює проксі-тунелі для пасивних з'єднань даних, які використовують списки та передавання файлів.

Конструктор приймає кінцеву точку проксі та необов'язкові облікові дані проксі. Сервер FTP залишається аргументом connect, а login отримує обліковий запис 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();
    }
}

Цей фрагмент передавання припускає імпорти FTP з Commons Net, java.io.IOException, змінні облікових даних, які надає застосунок, і вихідний потік, що належить викликачеві. remoteFile — це передбачувана назва файлу на боці сервера. Застосунок також має закрити свій вихідний потік у належний момент.

Установіть пасивний режим після підключення та перед операцією з даними. Реалізація FTPHTTPClient відхиляє з'єднання даних в активному режимі. У пасивному режимі вона узгоджує кінцеву точку даних із FTP і відкриває ще одне з'єднання з HTTP-проксі, а потім запитує тунель CONNECT до цієї кінцевої точки.

Цей другий тунель пояснює поширене обмеження: дозволу проксі для порту керування FTP недостатньо. Дозволені призначення та порти повинні включати пасивні кінцеві точки даних сервера. Успішне вітання та вхід доводять лише те, що маршрут керування працював.

Реалізація надає Basic-автентифікацію проксі, коли присутні і ім'я користувача, і пароль проксі. Це відрізняється від обміну FTP USER/PASS. Проксі, що вимагає іншого механізму автентифікації, потребує сумісного конектора; конструктор не робить доступною кожну схему.

Commons Net документує цей клас як експериментальний, тому оцініть його щодо вимог застосунку та проксі, перш ніж приймати. Це клієнт FTP, а не FTPS чи SFTP. Для FTPS із доступною службою SOCKS інтерфейс сокет-проксі FTPSClient — це окремий шлях клієнта. CONNECT надає маршрут і сам не шифрує облікові дані FTP чи вміст файлів.

Тримайте помилки прив'язаними до етапу, який їх спричинив: відмова HTTP під час налаштування тунелю, відмова у вході FTP або збій передавання FTP/даних. Заміна пароля FTP не може вирішити політику проксі, яка відхиляє пасивний порт даних.

Схожі статті