Commons Net FTPHTTPClient: HTTP proxy tunely pro pasivní FTP
Tunelujte řídicí spojení FTP i pasivní datová spojení přes HTTP proxy pomocí specializovaného klienta Commons Net.
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.