Commons Net FTPHTTPClient: tunnel proxy HTTP per FTP passivo
Tunnela il controllo FTP e le connessioni dati passive attraverso un proxy HTTP con il client dedicato di Commons Net.
Apache Commons Net include FTPHTTPClient per FTP tramite un proxy HTTP CONNECT. La sua caratteristica utile non è solo raggiungere la porta di login FTP: stabilisce anche tunnel proxy per le connessioni dati passive usate dagli elenchi e dai trasferimenti di file.
Il costruttore accetta l'endpoint del proxy e credenziali proxy opzionali. Il server FTP resta l'argomento di connect, e login riceve l'account 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();
}
}
Questo frammento di trasferimento presuppone gli import FTP di Commons Net, java.io.IOException, variabili di credenziali fornite dall'applicazione e uno stream di output di proprietà del chiamante. remoteFile è il nome file previsto lato server. L'applicazione deve anche chiudere il proprio stream di output al momento opportuno.
Impostare la modalità passiva dopo la connessione e prima di un'operazione dati. L'implementazione di FTPHTTPClient rifiuta le connessioni dati in modalità attiva. In modalità passiva negozia l'endpoint dati con FTP e apre un'altra connessione al proxy HTTP, quindi richiede un tunnel CONNECT verso quell'endpoint.
Quel secondo tunnel spiega un limite comune: l'autorizzazione del proxy per la porta di controllo FTP non basta. Le destinazioni e le porte consentite devono includere gli endpoint dati passivi del server. Un saluto e un login riusciti dimostrano solo che il percorso di controllo ha funzionato.
L'implementazione fornisce l'autenticazione proxy Basic quando sono presenti sia il nome utente sia la password del proxy. Ciò è distinto dallo scambio FTP USER/PASS. Un proxy che richieda un altro meccanismo di autenticazione necessita di un connettore compatibile; il costruttore non rende disponibile ogni schema.
Commons Net documenta questa classe come sperimentale, quindi valutarla rispetto ai requisiti dell'applicazione e del proxy prima di adottarla. È un client FTP, non un client FTPS o SFTP. Per FTPS con un servizio SOCKS disponibile, l'interfaccia socket-proxy di FTPSClient è un percorso client separato. CONNECT fornisce la rotta e non cifra di per sé le credenziali FTP o il contenuto dei file.
Mantenere gli errori collegati alla fase che li ha prodotti: un rifiuto HTTP durante la configurazione del tunnel, un rifiuto di login FTP o un errore di trasferimento FTP/dati. Sostituire la password FTP non può risolvere una politica proxy che rifiuta la porta dati passiva.