Apache Commons Net inclúe FTPHTTPClient para FTP a través dun proxy HTTP CONNECT. A súa característica útil non é só chegar ao porto de inicio de sesión FTP: tamén establece túneles de proxy para as conexións de datos pasivas que usan as listas e as transferencias de ficheiros.

O construtor acepta o punto final do proxy e credenciais de proxy opcionais. O servidor FTP segue a ser o argumento de connect, e login recibe a conta 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();
    }
}

Este fragmento de transferencia supón as importacións FTP de Commons Net, java.io.IOException, variables de credenciais proporcionadas pola aplicación e un fluxo de saída propiedade do chamador. remoteFile é o nome de ficheiro previsto no lado do servidor. A aplicación tamén debe pechar o seu fluxo de saída no momento axeitado.

Estableza o modo pasivo despois de conectar e antes dunha operación de datos. A implementación de FTPHTTPClient rexeita as conexións de datos en modo activo. En modo pasivo, negocia o punto final de datos con FTP e abre outra conexión ao proxy HTTP, e despois solicita un túnel CONNECT a ese punto final.

Ese segundo túnel explica un límite habitual: o permiso do proxy para o porto de control FTP non abonda. Os destinos e portos permitidos deben incluír os puntos finais de datos pasivos do servidor. Un saúdo e un inicio de sesión correctos só demostran que a ruta de control funcionou.

A implementación fornece autenticación de proxy Basic cando están presentes tanto o nome de usuario como o contrasinal do proxy. Iso é distinto do intercambio FTP USER/PASS. Un proxy que requira outro mecanismo de autenticación necesita un conector compatible; o construtor non pon a disposición todos os esquemas.

Commons Net documenta esta clase como experimental, así que avalíea fronte aos requisitos da aplicación e do proxy antes de adoptala. É un cliente FTP, non un cliente FTPS nin SFTP. Para FTPS cun servizo SOCKS dispoñible, a interface de socket-proxy de FTPSClient é unha ruta de cliente separada. CONNECT fornece a ruta e non cifra por si mesmo as credenciais FTP nin o contido dos ficheiros.

Manteña os erros asociados á etapa que os produciu: un rexeitamento HTTP durante a configuración do túnel, unha negativa de inicio de sesión FTP ou un fallo de transferencia FTP/datos. Substituír o contrasinal FTP non pode resolver unha política de proxy que rexeita o porto de datos pasivo.

Artigos relacionados