From 21c328fc113d28f3bbb1b1d74b53e4e2a36c4e9d Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 12 May 2015 00:32:08 +0900 Subject: [PATCH] sftp: Make sftp works through HTTP proxy --- src/FtpInitiateConnectionCommand.cc | 27 ++++++++++++++++++++------- src/FtpTunnelResponseCommand.cc | 8 ++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/FtpInitiateConnectionCommand.cc b/src/FtpInitiateConnectionCommand.cc index 3950fed0..78c0ca0c 100644 --- a/src/FtpInitiateConnectionCommand.cc +++ b/src/FtpInitiateConnectionCommand.cc @@ -132,18 +132,31 @@ std::unique_ptr FtpInitiateConnectionCommand::createNextCommandProxied setConnectedAddrInfo(getRequest(), hostname, pooledSocket); if(proxyMethod == V_TUNNEL) { + if (getRequest()->getProtocol() == "sftp") { + return make_unique + (getCuid(), + getRequest(), + getFileEntry(), + getRequestGroup(), + getDownloadEngine(), + pooledSocket, + SftpNegotiationCommand::SEQ_SFTP_OPEN); + } + // options contains "baseWorkingDir" return make_unique (getCuid(), - getRequest(), - getFileEntry(), - getRequestGroup(), - getDownloadEngine(), - pooledSocket, - FtpNegotiationCommand::SEQ_SEND_CWD_PREP, - options); + getRequest(), + getFileEntry(), + getRequestGroup(), + getDownloadEngine(), + pooledSocket, + FtpNegotiationCommand::SEQ_SEND_CWD_PREP, + options); } + assert(getRequest()->getProtocol() == "ftp"); + if(proxyMethod != V_GET) { assert(0); return nullptr; diff --git a/src/FtpTunnelResponseCommand.cc b/src/FtpTunnelResponseCommand.cc index ed626f0d..9283e75e 100644 --- a/src/FtpTunnelResponseCommand.cc +++ b/src/FtpTunnelResponseCommand.cc @@ -40,6 +40,7 @@ #include "Segment.h" #include "SocketCore.h" #include "SocketRecvBuffer.h" +#include "SftpNegotiationCommand.h" namespace aria2 { @@ -59,6 +60,13 @@ FtpTunnelResponseCommand::~FtpTunnelResponseCommand() {} std::unique_ptr FtpTunnelResponseCommand::getNextCommand() { + if (getRequest()->getProtocol() == "sftp") { + return make_unique + (getCuid(), getRequest(), getFileEntry(), + getRequestGroup(), getDownloadEngine(), + getSocket()); + } + return make_unique (getCuid(), getRequest(), getFileEntry(), getRequestGroup(), getDownloadEngine(),