/* */ #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 std::shared_ptr& req, const std::shared_ptr& proxyRequest, const std::shared_ptr& fileEntry, RequestGroup* requestGroup, DownloadEngine* e, const std::shared_ptr& s) : AbstractCommand(cuid, req, fileEntry, requestGroup, e, s), proxyRequest_(proxyRequest) { setTimeout(std::chrono::seconds(getOption()->getAsInt(PREF_CONNECT_TIMEOUT))); disableReadCheckSocket(); setWriteCheckSocket(getSocket()); } ConnectCommand::~ConnectCommand() { if (backupConnectionInfo_) { backupConnectionInfo_->cancel = true; } } void ConnectCommand::setControlChain( const std::shared_ptr>& chain) { chain_ = chain; } void ConnectCommand::setBackupConnectInfo( const std::shared_ptr& info) { backupConnectionInfo_ = info; } const std::shared_ptr& 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() const { return backupConnectionInfo_ && !backupConnectionInfo_->ipaddr.empty(); } } // namespace aria2