/* */ #include "HttpListenCommand.h" #include "DownloadEngine.h" #include "RecoverableException.h" #include "message.h" #include "Logger.h" #include "SocketCore.h" #include "HttpServerCommand.h" #include "CUIDCounter.h" #include "RequestGroupMan.h" #include "FileEntry.h" #include "prefs.h" #include "Option.h" #include "util.h" #include "ServerStatMan.h" #include "FileAllocationEntry.h" #include "CheckIntegrityEntry.h" #include "A2STR.h" namespace aria2 { HttpListenCommand::HttpListenCommand (cuid_t cuid, DownloadEngine* e, int family): Command(cuid), e_(e), family_(family) {} HttpListenCommand::~HttpListenCommand() { if(!serverSocket_.isNull()) { e_->deleteSocketForReadCheck(serverSocket_, this); } } bool HttpListenCommand::execute() { if(e_->getRequestGroupMan()->downloadFinished() || e_->isHaltRequested()) { return true; } try { if(serverSocket_->isReadable(0)) { SharedHandle socket(serverSocket_->acceptConnection()); socket->setNonBlockingMode(); std::pair peerInfo; socket->getPeerInfo(peerInfo); getLogger()->info("XML-RPC: Accepted the connection from %s:%u.", peerInfo.first.c_str(), peerInfo.second); HttpServerCommand* c = new HttpServerCommand(e_->newCUID(), e_, socket); e_->setNoWait(true); e_->addCommand(c); } } catch(RecoverableException& e) { if(getLogger()->debug()) { getLogger()->debug(MSG_ACCEPT_FAILURE, e, util::itos(getCuid()).c_str()); } } e_->addCommand(this); return false; } bool HttpListenCommand::bindPort(uint16_t port) { if(!serverSocket_.isNull()) { e_->deleteSocketForReadCheck(serverSocket_, this); } serverSocket_.reset(new SocketCore()); if(getLogger()->info()) { getLogger()->info("CUID#%s - Setting up HttpListenCommand for IPv%d", util::itos(getCuid()).c_str(), family_ == AF_INET?4:6); } try { int flags = 0; if(e_->getOption()->getAsBool(PREF_XML_RPC_LISTEN_ALL)) { flags = AI_PASSIVE; } serverSocket_->bind(A2STR::NIL, port, family_, flags); serverSocket_->beginListen(); serverSocket_->setNonBlockingMode(); if(getLogger()->info()) { getLogger()->info(MSG_LISTENING_PORT, util::itos(getCuid()).c_str(), port); } e_->addSocketForReadCheck(serverSocket_, this); return true; } catch(RecoverableException& e) { getLogger()->error(MSG_BIND_FAILURE, e, util::itos(getCuid()).c_str(), port); if(!serverSocket_.isNull()) { e_->deleteSocketForReadCheck(serverSocket_, this); } serverSocket_->closeConnection(); } return false; } } // namespace aria2