summaryrefslogtreecommitdiff
path: root/src/FtpNegotiationCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-04-01 00:12:27 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2013-04-01 00:12:27 +0900
commit597e1a5c1b10aa3668f91bcae02a864dcd0c045b (patch)
tree4437c2896b410b441013452b7385dfa303441772 /src/FtpNegotiationCommand.cc
parentd671d8bf3672cbefc06f3727f82b77872abe6120 (diff)
Implement simple Happy Eyeballs for HTTP/FTP downloads
Diffstat (limited to 'src/FtpNegotiationCommand.cc')
-rw-r--r--src/FtpNegotiationCommand.cc44
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