Apache Commons Net include FTPHTTPClient pentru FTP printr-un proxy HTTP CONNECT. Caracteristica sa utilă nu este doar atingerea portului de autentificare FTP: stabilește și tuneluri proxy pentru conexiunile de date pasive folosite de listări și transferuri de fișiere.

Constructorul acceptă punctul final al proxy-ului și credențiale de proxy opționale. Serverul FTP rămâne argumentul pentru connect, iar login primește contul 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();
    }
}

Acest fragment de transfer presupune importurile FTP ale Commons Net, java.io.IOException, variabile de credențiale furnizate de aplicație și un flux de ieșire deținut de apelant. remoteFile este numele de fișier dorit pe partea serverului. Aplicația trebuie, de asemenea, să își închidă fluxul de ieșire în momentul potrivit.

Setați modul pasiv după conectare și înainte de o operațiune de date. Implementarea FTPHTTPClient respinge conexiunile de date în modul activ. În modul pasiv, negociază punctul final de date cu FTP și deschide o altă conexiune către proxy-ul HTTP, apoi solicită un tunel CONNECT către acel punct final.

Acest al doilea tunel explică o limită obișnuită: permisiunea proxy pentru portul de control FTP nu este suficientă. Destinațiile și porturile permise trebuie să includă punctele finale de date pasive ale serverului. O salutare și o autentificare reușite dovedesc doar că ruta de control a funcționat.

Implementarea oferă autentificare proxy Basic când sunt prezente atât numele de utilizator, cât și parola proxy-ului. Aceasta este diferită de schimbul FTP USER/PASS. Un proxy care necesită alt mecanism de autentificare are nevoie de un conector compatibil; constructorul nu face disponibilă fiecare schemă.

Commons Net documentează această clasă ca experimentală, așa că evaluați-o față de cerințele aplicației și ale proxy-ului înainte de a o adopta. Este un client FTP, nu un client FTPS sau SFTP. Pentru FTPS cu un serviciu SOCKS disponibil, interfața socket-proxy a FTPSClient este o cale de client separată. CONNECT oferă ruta și nu criptează el însuși credențialele FTP sau conținutul fișierelor.

Păstrați erorile legate de etapa care le-a produs: o respingere HTTP în timpul configurării tunelului, o refuzare a autentificării FTP sau o eroare de transfer FTP/date. Înlocuirea parolei FTP nu poate rezolva o politică de proxy care respinge portul de date pasiv.

Articole similare