/* */ #include "ConnectCommand.h" #include "BackupIPv4ConnectCommand.h" #include "ControlChain.h" #include "Option.h" #include "message.h" #include "SocketCore.h" #include "fmt.h" #include "LogFactory.h" #include "DownloadEngine.h" #include "Request.h" #include "prefs.h" #include "SocketRecvBuffer.h" namespace aria2 { ConnectCommand::ConnectCommand(cuid_t cuid, const SharedHandle& req, const SharedHandle& proxyRequest, const SharedHandle& fileEntry, RequestGroup* requestGroup, DownloadEngine* e, const SharedHandle& s) : AbstractCommand(cuid, req, fileEntry, requestGroup, e, s), proxyRequest_(proxyRequest) { setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)); disableReadCheckSocket(); setWriteCheckSocket(getSocket()); } ConnectCommand::~ConnectCommand() { if(backupConnectionInfo_) { backupConnectionInfo_->cancel = true; } } void ConnectCommand::setControlChain (const SharedHandle >& chain) { chain_ = chain; } void ConnectCommand::setBackupConnectInfo (const SharedHandle& info) { backupConnectionInfo_ = info; } const SharedHandle& ConnectCommand::getProxyRequest() const { return proxyRequest_; } bool ConnectCommand::executeInternal() { 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()); swapSocket(backupConnectionInfo_->socket); backupConnectionInfo_.reset(); } if(!checkIfConnectionEstablished (getSocket(), getRequest()->getConnectedHostname(), getRequest()->getConnectedAddr(), getRequest()->getConnectedPort())) { return true; } if(backupConnectionInfo_) { backupConnectionInfo_->cancel = true; backupConnectionInfo_.reset(); } chain_->run(this, getDownloadEngine()); return true; } bool ConnectCommand::noCheck() { return backupConnectionInfo_ && !backupConnectionInfo_->ipaddr.empty(); } } // namespace aria2