Commons Net FTPHTTPClient : tunnels proxy HTTP pour FTP passif
Tunnélisez le contrôle FTP et les connexions de données passives via un proxy HTTP avec le client dédié de Commons Net.
Apache Commons Net fournit FTPHTTPClient pour FTP via un proxy HTTP CONNECT. Sa fonction utile ne se limite pas à atteindre le port de connexion FTP : il établit aussi des tunnels proxy pour les connexions de données passives utilisées par les listages et les transferts de fichiers.
Le constructeur accepte le point de terminaison du proxy et des identifiants de proxy facultatifs. Le serveur FTP reste l'argument de connect, et login reçoit le compte 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();
}
}
Cet extrait de transfert suppose les imports FTP de Commons Net, java.io.IOException, des variables d'identifiants fournies par l'application et un flux de sortie possédé par l'appelant. remoteFile est le nom de fichier prévu côté serveur. L'application doit aussi fermer son flux de sortie au moment approprié.
Activez le mode passif après la connexion et avant une opération de données. L'implémentation de FTPHTTPClient refuse les connexions de données en mode actif. En mode passif, elle négocie le point de terminaison de données avec FTP et ouvre une autre connexion au proxy HTTP, puis demande un tunnel CONNECT vers ce point de terminaison.
Ce second tunnel explique une limite courante : l'autorisation du proxy pour le port de contrôle FTP ne suffit pas. Les destinations et ports autorisés doivent inclure les points de terminaison de données passifs du serveur. Un accueil et une connexion réussis prouvent seulement que la route de contrôle a fonctionné.
L'implémentation fournit une authentification proxy Basic lorsque le nom d'utilisateur et le mot de passe du proxy sont tous deux présents. Cela diffère de l'échange FTP USER/PASS. Un proxy exigeant un autre mécanisme d'authentification a besoin d'un connecteur compatible ; le constructeur ne rend pas chaque schéma disponible.
Commons Net documente cette classe comme expérimentale ; évaluez-la donc par rapport aux exigences de l'application et du proxy avant de l'adopter. C'est un client FTP, pas un client FTPS ni SFTP. Pour FTPS avec un service SOCKS disponible, l'interface socket-proxy de FTPSClient est une voie de client distincte. CONNECT fournit la route et ne chiffre pas lui-même les identifiants FTP ni le contenu des fichiers.
Gardez les erreurs rattachées à l'étape qui les a produites : un rejet HTTP lors de la mise en place du tunnel, un refus de connexion FTP ou un échec de transfert FTP/données. Remplacer le mot de passe FTP ne peut pas résoudre une politique de proxy qui rejette le port de données passif.