Apache Commons Net incluye FTPHTTPClient para FTP a través de un proxy HTTP CONNECT. Su característica útil no es solo alcanzar el puerto de inicio de sesión FTP: también establece túneles de proxy para las conexiones de datos pasivas que usan los listados y las transferencias de archivos.

El constructor acepta el punto de conexión del proxy y credenciales de proxy opcionales. El servidor FTP sigue siendo el argumento de connect, y login recibe la cuenta 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 supone las importaciones FTP de Commons Net, java.io.IOException, variables de credenciales proporcionadas por la aplicación y un flujo de salida propiedad del llamador. remoteFile es el nombre de archivo previsto en el lado del servidor. La aplicación también debe cerrar su flujo de salida en el momento adecuado.

Establezca el modo pasivo después de conectar y antes de una operación de datos. La implementación de FTPHTTPClient rechaza las conexiones de datos en modo activo. En modo pasivo, negocia el punto de conexión de datos con FTP y abre otra conexión al proxy HTTP, y luego solicita un túnel CONNECT a ese punto de conexión.

Ese segundo túnel explica un límite habitual: el permiso del proxy para el puerto de control FTP no basta. Los destinos y puertos permitidos deben incluir los puntos de conexión de datos pasivos del servidor. Un saludo y un inicio de sesión correctos solo demuestran que la ruta de control funcionó.

La implementación proporciona autenticación de proxy Basic cuando están presentes tanto el nombre de usuario como la contraseña del proxy. Eso es distinto del intercambio FTP USER/PASS. Un proxy que exija otro mecanismo de autenticación necesita un conector compatible; el constructor no pone a disposición todos los esquemas.

Commons Net documenta esta clase como experimental, así que evalúela frente a los requisitos de la aplicación y del proxy antes de adoptarla. Es un cliente FTP, no un cliente FTPS ni SFTP. Para FTPS con un servicio SOCKS disponible, la interfaz de socket-proxy de FTPSClient es una ruta de cliente aparte. CONNECT proporciona la ruta y no cifra por sí mismo las credenciales FTP ni el contenido de los archivos.

Mantenga los errores asociados a la etapa que los produjo: un rechazo HTTP durante la configuración del túnel, una negativa de inicio de sesión FTP o un fallo de transferencia FTP/datos. Sustituir la contraseña FTP no puede resolver una política de proxy que rechaza el puerto de datos pasivo.

Artículos relacionados