Apache Commons Net obsahuje FTPHTTPClient pre FTP cez HTTP CONNECT proxy. Jeho užitočná vlastnosť nie je len dosiahnutie prihlasovacieho portu FTP: vytvára aj proxy tunely pre pasívne dátové spojenia, ktoré používajú výpisy a prenosy súborov.

Konštruktor prijíma koncový bod proxy a voliteľné prihlasovacie údaje proxy. Server FTP zostáva argumentom connect a login prijíma účet 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();
    }
}

Tento fragment prenosu predpokladá FTP importy Commons Net, java.io.IOException, premenné s prihlasovacími údajmi poskytnuté aplikáciou a výstupný tok vlastnený volajúcim. remoteFile je zamýšľaný názov súboru na strane servera. Aplikácia musí tiež zavrieť svoj výstupný tok v správnom okamihu.

Nastavte pasívny režim po pripojení a pred dátovou operáciou. Implementácia FTPHTTPClient odmieta dátové spojenia v aktívnom režime. V pasívnom režime vyjednáva koncový bod dát s FTP a otvorí ďalšie spojenie k HTTP proxy, potom požiada o tunel CONNECT k tomuto koncovému bodu.

Tento druhý tunel vysvetľuje bežnú hranicu: povolenie proxy pre riadiaci port FTP nestačí. Povolené ciele a porty musia zahŕňať pasívne dátové koncové body servera. Úspešné privítanie a prihlásenie dokazujú len to, že riadiaca trasa fungovala.

Implementácia poskytuje Basic autentifikáciu proxy, keď sú prítomné meno aj heslo proxy. To sa líši od výmeny FTP USER/PASS. Proxy vyžadujúca iný autentifikačný mechanizmus potrebuje kompatibilný konektor; konštruktor nesprístupňuje každú schému.

Commons Net dokumentuje túto triedu ako experimentálnu, preto ju pred prijatím vyhodnoťte podľa požiadaviek aplikácie a proxy. Je to klient FTP, nie klient FTPS alebo SFTP. Pre FTPS s dostupnou službou SOCKS je rozhranie socket-proxy triedy FTPSClient samostatná klientska cesta. CONNECT poskytuje trasu a sám nešifruje prihlasovacie údaje FTP ani obsah súborov.

Udržujte chyby spojené s fázou, ktorá ich spôsobila: odmietnutie HTTP pri nastavovaní tunela, odmietnutie prihlásenia FTP alebo zlyhanie prenosu FTP/dát. Nahradenie hesla FTP nemôže vyriešiť pravidlo proxy, ktoré odmieta pasívny dátový port.

Súvisiace články