/* */ #include "HttpServerCommand.h" #include #include #include #include #include "SocketCore.h" #include "DownloadEngine.h" #include "HttpServer.h" #include "HttpHeader.h" #include "Logger.h" #include "RequestGroup.h" #include "RequestGroupMan.h" #include "BtContext.h" #include "Util.h" #include "HttpServerResponseCommand.h" #include "CheckIntegrityEntry.h" #include "FileAllocationEntry.h" #include "RecoverableException.h" namespace aria2 { HttpServerCommand::HttpServerCommand(int32_t cuid, DownloadEngine* e, const SharedHandle& socket): Command(cuid), _e(e), _socket(socket), _httpServer(new HttpServer(socket, e)) { _e->addSocketForReadCheck(_socket, this); } HttpServerCommand::HttpServerCommand(int32_t cuid, const SharedHandle& httpServer, DownloadEngine* e, const SharedHandle& socket): Command(cuid), _e(e), _socket(socket), _httpServer(httpServer) { _e->addSocketForReadCheck(_socket, this); } HttpServerCommand::~HttpServerCommand() { _e->deleteSocketForReadCheck(_socket, this); } class PrintSummaryHtml { private: std::ostream& _o; public: PrintSummaryHtml(std::ostream& o):_o(o) {} void operator()(const SharedHandle& rg) { _o << "
getGID() << "\">" << "[#" << rg->getGID() << "]" << " FILE:" << "" << Util::htmlEscape(rg->getFilePath()) << ""; #ifdef ENABLE_BITTORRENT SharedHandle btContext = dynamic_pointer_cast(rg->getDownloadContext()); if(!btContext.isNull()) { _o << "
" << " Info Hash:" << btContext->getInfoHashAsString(); } #endif // ENABLE_BITTORRENT _o << "
"; TransferStat stat = rg->calculateStat(); unsigned int eta = 0; if(rg->getTotalLength() > 0 && stat.getDownloadSpeed() > 0) { eta = (rg->getTotalLength()-rg->getCompletedLength())/stat.getDownloadSpeed(); } #ifdef ENABLE_BITTORRENT if(!btContext.isNull() && rg->downloadFinished()) { _o << "SEEDING" << "(" << "ratio:" << std::fixed << std::setprecision(1) << ((stat.getAllTimeUploadLength()*10)/rg->getCompletedLength())/10.0 << ") "; } #endif // ENABLE_BITTORRENT _o << Util::abbrevSize(rg->getCompletedLength()) << "B" << "/" << Util::abbrevSize(rg->getTotalLength()) << "B"; if(rg->getTotalLength() > 0) { _o << "(" << 100*rg->getCompletedLength()/rg->getTotalLength() << "%)"; } _o << " " << "CN:" << rg->getNumConnection(); if(!rg->downloadFinished()) { _o << " " << "SPD:" << std::fixed << std::setprecision(2) << stat.getDownloadSpeed()/1024.0 << "KiB/s"; } if(stat.getSessionUploadLength() > 0) { _o << " " << "UP:" << std::fixed << std::setprecision(2) << stat.getUploadSpeed()/1024.0 << "KiB/s" << "(" << Util::abbrevSize(stat.getAllTimeUploadLength()) << "B)"; } if(eta > 0) { _o << " " << "ETA:" << Util::htmlEscape(Util::secfmt(eta)); } _o << "
" << "
"; } }; static std::string createResponse(DownloadEngine* e) { std::ostringstream strm; const std::deque > groups = e->_requestGroupMan->getRequestGroups(); std::for_each(groups.begin(), groups.end(), PrintSummaryHtml(strm)); { SharedHandle entry = e->_fileAllocationMan->getPickedEntry(); if(!entry.isNull()) { strm << "
" << "[FileAlloc:" << "#" << entry->getRequestGroup()->getGID() << " " << Util::abbrevSize(entry->getCurrentLength()) << "B" << "/" << Util::abbrevSize(entry->getTotalLength()) << "B" << "("; if(entry->getTotalLength() > 0) { strm << 100*entry->getCurrentLength()/entry->getTotalLength(); } else { strm << "--"; } strm << "%)" << "]"; if(e->_fileAllocationMan->hasNext()) { strm << "(" << e->_fileAllocationMan->countEntryInQueue() << "waiting...)"; } strm << "

"; } } #ifdef ENABLE_MESSAGE_DIGEST { SharedHandle entry = e->_checkIntegrityMan->getPickedEntry(); if(!entry.isNull()) { strm << "
" << "[HashCheck:" << "#" << entry->getRequestGroup()->getGID() << " " << Util::abbrevSize(entry->getCurrentLength()) << "B" << "/" << Util::abbrevSize(entry->getTotalLength()) << "B" << "(" << 100*entry->getCurrentLength()/entry->getTotalLength() << "%)" << "]"; if(e->_checkIntegrityMan->hasNext()) { strm << "(" << e->_checkIntegrityMan->countEntryInQueue() << "waiting...)"; } strm << "

"; } } #endif // ENABLE_MESSAGE_DIGEST std::string body = "" "" "" "" "aria2" "" "

aria2 - Download Progress

"+strm.str()+"" ""; return body; } bool HttpServerCommand::execute() { if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) { return true; } if(_socket->isReadable(0)) { _timeout.reset(); SharedHandle header; try { header = _httpServer->receiveRequest(); } catch(RecoverableException& e) { logger->info("CUID#%d - Error occurred while reading HTTP request", e, cuid); return true; } if(header.isNull()) { _e->commands.push_back(this); return false; } else { _httpServer->feedResponse(createResponse(_e)); Command* command = new HttpServerResponseCommand(cuid, _httpServer, _e, _socket); command->setStatus(Command::STATUS_ONESHOT_REALTIME); _e->commands.push_back(command); _e->setNoWait(true); return true; } } else { if(_timeout.elapsed(30)) { logger->info("HTTP request timeout."); return true; } else { _e->commands.push_back(this); return false; } } } } // namespace aria2