/* */ #include "AbstractProxyRequestCommand.h" #include "DownloadEngine.h" #include "RequestGroup.h" #include "Request.h" #include "HttpConnection.h" #include "HttpRequest.h" #include "Segment.h" #include "Option.h" #include "prefs.h" #include "SocketCore.h" #include "DownloadContext.h" #include "SocketRecvBuffer.h" #include "BackupIPv4ConnectCommand.h" #include "fmt.h" #include "LogFactory.h" namespace aria2 { AbstractProxyRequestCommand::AbstractProxyRequestCommand (cuid_t cuid, const SharedHandle& req, const SharedHandle& fileEntry, RequestGroup* requestGroup, DownloadEngine* e, const SharedHandle& proxyRequest, const SharedHandle& s) : AbstractCommand(cuid, req, fileEntry, requestGroup, e, s), proxyRequest_(proxyRequest), httpConnection_ (new HttpConnection (cuid, s, SharedHandle(new SocketRecvBuffer(s)))) { setTimeout(getOption()->getAsInt(PREF_CONNECT_TIMEOUT)); disableReadCheckSocket(); setWriteCheckSocket(getSocket()); } AbstractProxyRequestCommand::~AbstractProxyRequestCommand() { if(backupConnectionInfo_) { backupConnectionInfo_->cancel = true; } } bool AbstractProxyRequestCommand::noCheck() { return backupConnectionInfo_ && !backupConnectionInfo_->ipaddr.empty(); } bool AbstractProxyRequestCommand::executeInternal() { //socket->setBlockingMode(); if(httpConnection_->sendBufferIsEmpty()) { 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()); Command* c = createSelf(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())) { return true; } if(backupConnectionInfo_) { backupConnectionInfo_->cancel = true; backupConnectionInfo_.reset(); } SharedHandle httpRequest(new HttpRequest()); httpRequest->setUserAgent(getOption()->get(PREF_USER_AGENT)); httpRequest->setRequest(getRequest()); httpRequest->setProxyRequest(proxyRequest_); httpConnection_->sendProxyRequest(httpRequest); } else { httpConnection_->sendPendingData(); } if(httpConnection_->sendBufferIsEmpty()) { getDownloadEngine()->addCommand(getNextCommand()); return true; } else { setWriteCheckSocket(getSocket()); getDownloadEngine()->addCommand(this); return false; } } void AbstractProxyRequestCommand::setBackupConnectInfo (const SharedHandle& info) { backupConnectionInfo_ = info; } } // namespace aria2