Apache Commons Net obsahuje FTPHTTPClient pro FTP přes HTTP CONNECT proxy. Jeho užitečná vlastnost není jen dosažení přihlašovacího portu FTP: vytváří také proxy tunely pro pasivní datová spojení, která používají výpisy a přenosy souborů.

Konstruktor přijímá koncový bod proxy a volitelné přihlašovací údaje proxy. Server FTP zůstává argumentem connect a login přijímá účet 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();
    }
}

Tento fragment přenosu předpokládá FTP importy Commons Net, java.io.IOException, proměnné s přihlašovacími údaji dodané aplikací a výstupní proud vlastněný volajícím. remoteFile je zamýšlený název souboru na straně serveru. Aplikace musí také zavřít svůj výstupní proud ve vhodném okamžiku.

Nastavte pasivní režim po připojení a před datovou operací. Implementace FTPHTTPClient odmítá datová spojení v aktivním režimu. V pasivním režimu vyjedná koncový bod dat s FTP a otevře další spojení k HTTP proxy, poté požádá o tunel CONNECT k tomuto koncovému bodu.

Tento druhý tunel vysvětluje běžnou hranici: oprávnění proxy pro řídicí port FTP nestačí. Povolené cíle a porty musí zahrnovat pasivní datové koncové body serveru. Úspěšné přivítání a přihlášení dokazují jen to, že řídicí trasa fungovala.

Implementace poskytuje Basic autentizaci proxy, když jsou přítomny jak uživatelské jméno, tak heslo proxy. To se liší od výměny FTP USER/PASS. Proxy vyžadující jiný autentizační mechanismus potřebuje kompatibilní konektor; konstruktor nezpřístupňuje každé schéma.

Commons Net dokumentuje tuto třídu jako experimentální, proto ji před přijetím vyhodnoťte podle požadavků aplikace a proxy. Je to klient FTP, nikoli klient FTPS nebo SFTP. Pro FTPS s dostupnou službou SOCKS je rozhraní socket-proxy třídy FTPSClient samostatná klientská cesta. CONNECT poskytuje trasu a sám nešifruje přihlašovací údaje FTP ani obsah souborů.

Udržujte chyby spojené s fází, která je způsobila: odmítnutí HTTP při nastavování tunelu, odmítnutí přihlášení FTP nebo selhání přenosu FTP/dat. Nahrazení hesla FTP nemůže vyřešit zásadu proxy, která odmítá pasivní datový port.

Související články