diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-04-01 00:12:27 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2013-04-01 00:12:27 +0900 |
| commit | 597e1a5c1b10aa3668f91bcae02a864dcd0c045b (patch) | |
| tree | 4437c2896b410b441013452b7385dfa303441772 /src/FtpNegotiationCommand.cc | |
| parent | d671d8bf3672cbefc06f3727f82b77872abe6120 (diff) | |
Implement simple Happy Eyeballs for HTTP/FTP downloads
Diffstat (limited to 'src/FtpNegotiationCommand.cc')
| -rw-r--r-- | src/FtpNegotiationCommand.cc | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc index 03827b54..b21ff71f 100644 --- a/src/FtpNegotiationCommand.cc +++ b/src/FtpNegotiationCommand.cc @@ -74,6 +74,7 @@ #include "CheckIntegrityEntry.h" #include "error_code.h" #include "SocketRecvBuffer.h" +#include "BackupIPv4ConnectCommand.h" #ifdef ENABLE_MESSAGE_DIGEST # include "ChecksumCheckIntegrityEntry.h" #endif // ENABLE_MESSAGE_DIGEST @@ -105,7 +106,16 @@ FtpNegotiationCommand::FtpNegotiationCommand setWriteCheckSocket(getSocket()); } -FtpNegotiationCommand::~FtpNegotiationCommand() {} +FtpNegotiationCommand::~FtpNegotiationCommand() +{ + if(backupConnectionInfo_) { + backupConnectionInfo_->cancel = true; + } +} + +bool FtpNegotiationCommand::noCheck() { + return backupConnectionInfo_ && !backupConnectionInfo_->ipaddr.empty(); +} bool FtpNegotiationCommand::executeInternal() { while(processSequence(getSegments().front())); @@ -145,12 +155,38 @@ bool FtpNegotiationCommand::executeInternal() { } bool FtpNegotiationCommand::recvGreeting() { + if(backupConnectionInfo_ && !backupConnectionInfo_->ipaddr.empty()) { + A2_LOG_INFO(fmt("CUID#%"PRId64" - Use backup connection address %s", + getCuid(), backupConnectionInfo_->ipaddr.c_str())); + getDownloadEngine()->markBadIPAddress + (getRequest()->getConnectedHostname(), + getRequest()->getConnectedAddr(), + getRequest()->getConnectedPort()); + + getRequest()->setConnectedAddrInfo(getRequest()->getConnectedHostname(), + backupConnectionInfo_->ipaddr, + getRequest()->getConnectedPort()); + + FtpNegotiationCommand* c = + new FtpNegotiationCommand(getCuid(), getRequest(), getFileEntry(), + getRequestGroup(), getDownloadEngine(), + backupConnectionInfo_->socket); + c->setStatus(STATUS_ONESHOT_REALTIME); + getDownloadEngine()->setNoWait(true); + getDownloadEngine()->addCommand(c); + backupConnectionInfo_.reset(); + return true; + } if(!checkIfConnectionEstablished (getSocket(), getRequest()->getConnectedHostname(), getRequest()->getConnectedAddr(), getRequest()->getConnectedPort())) { sequence_ = SEQ_EXIT; return false; } + if(backupConnectionInfo_) { + backupConnectionInfo_->cancel = true; + backupConnectionInfo_.reset(); + } setTimeout(getRequestGroup()->getTimeout()); //socket->setBlockingMode(); disableWriteCheckSocket(); @@ -973,4 +1009,10 @@ void FtpNegotiationCommand::onDryRunFileFound() sequence_ = SEQ_HEAD_OK; } +void FtpNegotiationCommand::setBackupConnectInfo +(const SharedHandle<BackupConnectInfo>& info) +{ + backupConnectionInfo_ = info; +} + } // namespace aria2 |
