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.

Articoli correlati