/* */ #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" namespace aria2 { HttpListenCommand::HttpListenCommand(cuid_t cuid, DownloadEngine* e): Command(cuid),_e(e) {} HttpListenCommand::~HttpListenCommand() { if(!_serverSocket.isNull()) { _e->deleteSocketForReadCheck(_serverSocket, this); } } bool HttpListenCommand::execute() { if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) { return true; } try { if(_serverSocket->isReadable(0)) { SharedHandle socket(_serverSocket->acceptConnection()); socket->setNonBlockingMode(); std::pair peerInfo; socket->getPeerInfo(peerInfo); logger->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->commands.push_back(c); } } catch(RecoverableException& e) { if(logger->debug()) { logger->debug(MSG_ACCEPT_FAILURE, e, util::itos(cuid).c_str()); } } _e->commands.push_back(this); return false; } bool HttpListenCommand::bindPort(uint16_t port) { if(!_serverSocket.isNull()) { _e->deleteSocketForReadCheck(_serverSocket, this); } _serverSocket.reset(new SocketCore()); if(logger->info()) { logger->info("CUID#%s - Setting up HttpListenCommand", util::itos(cuid).c_str()); } try { int flags = 0; if(_e->option->getAsBool(PREF_XML_RPC_LISTEN_ALL)) { flags = AI_PASSIVE; } _serverSocket->bind(port, flags); _serverSocket->beginListen(); _serverSocket->setNonBlockingMode(); if(logger->info()) { logger->info(MSG_LISTENING_PORT, util::itos(cuid).c_str(), port); } _e->addSocketForReadCheck(_serverSocket, this); return true; } catch(RecoverableException& e) { logger->error(MSG_BIND_FAILURE, e, util::itos(cuid).c_str(), port); if(!_serverSocket.isNull()) { _e->deleteSocketForReadCheck(_serverSocket, this); } _serverSocket->closeConnection(); } return false; } } // namespace aria2