Commons Net FTPHTTPClient: túneis de proxy HTTP para FTP passivo
Tunela o controlo FTP e as ligações de dados passivas através de um proxy HTTP com o cliente dedicado do Commons Net.
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.