O Apache Commons Net inclui FTPHTTPClient para FTP através de um proxy HTTP CONNECT. A sua característica útil não é apenas alcançar a porta de início de sessão FTP: também estabelece túneis de proxy para as ligações de dados passivas usadas pelas listagens e transferências de ficheiros.

O construtor aceita o ponto final do proxy e credenciais de proxy opcionais. O servidor FTP continua a ser o argumento de connect, e login recebe 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 transferência pressupõe as importações FTP do Commons Net, java.io.IOException, variáveis de credenciais fornecidas pela aplicação e um fluxo de saída pertencente ao chamador. remoteFile é o nome de ficheiro pretendido do lado do servidor. A aplicação também deve fechar o seu fluxo de saída no momento adequado.

Defina o modo passivo após a ligação e antes de uma operação de dados. A implementação do FTPHTTPClient rejeita ligações de dados em modo ativo. Em modo passivo, negocia o ponto final de dados com o FTP e abre outra ligação ao proxy HTTP, e depois pede um túnel CONNECT para esse ponto final.

Esse segundo túnel explica um limite comum: a permissão do proxy para a porta de controlo FTP não é suficiente. Os destinos e portas permitidos devem incluir os pontos finais de dados passivos do servidor. Uma saudação e um início de sessão bem-sucedidos provam apenas que a rota de controlo funcionou.

A implementação fornece autenticação de proxy Basic quando estão presentes tanto o nome de utilizador como a palavra-passe do proxy. Isso é distinto da troca FTP USER/PASS. Um proxy que exija outro mecanismo de autenticação precisa de um conector compatível; o construtor não disponibiliza todos os esquemas.

O Commons Net documenta esta classe como experimental, por isso avalie-a face aos requisitos da aplicação e do proxy antes de a adotar. É um cliente FTP, não um cliente FTPS ou SFTP. Para FTPS com um serviço SOCKS disponível, a interface socket-proxy do FTPSClient é um caminho de cliente separado. O CONNECT fornece a rota e não cifra por si só as credenciais FTP nem o conteúdo dos ficheiros.

Mantenha os erros associados à etapa que os produziu: uma rejeição HTTP durante a configuração do túnel, uma recusa de início de sessão FTP ou uma falha de transferência FTP/dados. Substituir a palavra-passe FTP não resolve uma política de proxy que rejeita a porta de dados passiva.

Artigos relacionados