Commons Net FTPHTTPClient: HTTP-proxytunnels voor passieve FTP
Tunnel FTP-besturing en passieve dataverbindingen via een HTTP-proxy met de speciale client van Commons Net.
Apache Commons Net bevat FTPHTTPClient voor FTP via een HTTP CONNECT-proxy. Het nuttige kenmerk is niet alleen het bereiken van de FTP-loginpoort: het zet ook proxytunnels op voor de passieve dataverbindingen die lijsten en bestandsoverdrachten gebruiken.
De constructor accepteert het proxy-eindpunt en optionele proxyreferenties. De FTP-server blijft het argument van connect, en login ontvangt het FTP-account:
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();
}
}
Dit overdrachtsfragment veronderstelt de FTP-imports van Commons Net, java.io.IOException, door de toepassing geleverde referentievariabelen en een uitvoerstroom die eigendom is van de aanroeper. remoteFile is de beoogde bestandsnaam aan de serverzijde. De toepassing moet ook op het juiste moment zijn uitvoerstroom sluiten.
Stel de passieve modus in na het verbinden en vóór een dataoperatie. De implementatie van FTPHTTPClient weigert dataverbindingen in actieve modus. In passieve modus onderhandelt deze het data-eindpunt met FTP en opent een tweede verbinding naar de HTTP-proxy, en vraagt dan een CONNECT-tunnel naar dat eindpunt aan.
Die tweede tunnel verklaart een veelvoorkomende grens: proxitoestemming voor de FTP-besturingspoort is niet genoeg. De toegestane bestemmingen en poorten moeten de passieve data-eindpunten van de server omvatten. Een geslaagde begroeting en login bewijzen alleen dat de besturingsroute werkte.
De implementatie levert Basic-proxyauthenticatie wanneer zowel de proxygebruikersnaam als het wachtwoord aanwezig zijn. Dat verschilt van de FTP USER/PASS-uitwisseling. Een proxy die een ander authenticatiemechanisme vereist, heeft een compatibele connector nodig; de constructor maakt niet elk schema beschikbaar.
Commons Net documenteert deze klasse als experimenteel, dus beoordeel hem tegen de vereisten van de toepassing en de proxy voordat u hem adopteert. Het is een FTP-client, geen FTPS- of SFTP-client. Voor FTPS met een beschikbare SOCKS-dienst is de socket-proxy-interface van FTPSClient een aparte clientroute. CONNECT levert de route en versleutelt zelf geen FTP-referenties of bestandsinhoud.
Houd fouten gekoppeld aan de fase die ze veroorzaakte: een HTTP-weigering tijdens het opzetten van de tunnel, een geweigerde FTP-login of een FTP-/dataoverdrachtsfout. Het vervangen van het FTP-wachtwoord kan een proxybeleid dat de passieve datapoort weigert niet oplossen.