Apache Commons Net zawiera FTPHTTPClient do obsługi FTP przez proxy HTTP CONNECT. Jego użyteczną cechą jest nie tylko dotarcie do portu logowania FTP: ustanawia także tunele proxy dla pasywnych połączeń danych używanych przez listowania i transfery plików.

Konstruktor przyjmuje punkt końcowy proxy i opcjonalne poświadczenia proxy. Serwer FTP pozostaje argumentem connect, a login otrzymuje konto 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();
    }
}

Ten fragment transferu zakłada importy FTP Commons Net, java.io.IOException, zmienne poświadczeń dostarczane przez aplikację oraz strumień wyjściowy należący do wywołującego. remoteFile to zamierzona nazwa pliku po stronie serwera. Aplikacja musi także zamknąć swój strumień wyjściowy w odpowiednim momencie.

Ustaw tryb pasywny po połączeniu i przed operacją danych. Implementacja FTPHTTPClient odrzuca połączenia danych w trybie aktywnym. W trybie pasywnym negocjuje punkt końcowy danych z FTP i otwiera kolejne połączenie do proxy HTTP, a następnie żąda tunelu CONNECT do tego punktu końcowego.

Ten drugi tunel wyjaśnia częstą granicę: uprawnienie proxy do portu sterowania FTP nie wystarcza. Dozwolone cele i porty muszą obejmować pasywne punkty końcowe danych serwera. Udane powitanie i logowanie dowodzą tylko, że trasa sterowania działała.

Implementacja zapewnia uwierzytelnianie Basic proxy, gdy obecne są zarówno nazwa użytkownika, jak i hasło proxy. To różni się od wymiany FTP USER/PASS. Proxy wymagające innego mechanizmu uwierzytelniania potrzebuje zgodnego łącznika; konstruktor nie udostępnia każdego schematu.

Commons Net dokumentuje tę klasę jako eksperymentalną, więc oceń ją pod kątem wymagań aplikacji i proxy przed przyjęciem. To klient FTP, a nie klient FTPS lub SFTP. Dla FTPS z dostępną usługą SOCKS interfejs socket-proxy FTPSClient jest osobną ścieżką klienta. CONNECT zapewnia trasę i sam nie szyfruje poświadczeń FTP ani zawartości plików.

Utrzymuj błędy powiązane z etapem, który je spowodował: odrzucenie HTTP podczas konfiguracji tunelu, odmowa logowania FTP lub błąd transferu FTP/danych. Zmiana hasła FTP nie rozwiąże polityki proxy odrzucającej pasywny port danych.

Powiązane artykuły