/* */ #include "HttpServerCommand.h" #include "SocketCore.h" #include "DownloadEngine.h" #include "HttpServer.h" #include "HttpHeader.h" #include "Logger.h" #include "RequestGroup.h" #include "RequestGroupMan.h" #include "HttpServerBodyCommand.h" #include "HttpServerResponseCommand.h" #include "RecoverableException.h" #include "prefs.h" #include "Option.h" #include "util.h" #include "DownloadContext.h" #include "wallclock.h" #include "ServerStatMan.h" #include "FileAllocationEntry.h" #include "CheckIntegrityEntry.h" namespace aria2 { HttpServerCommand::HttpServerCommand(cuid_t cuid, DownloadEngine* e, const SharedHandle& socket): Command(cuid), _e(e), _socket(socket), _httpServer(new HttpServer(socket, e)) { setStatus(Command::STATUS_ONESHOT_REALTIME); _e->addSocketForReadCheck(_socket, this); _httpServer->setUsernamePassword(_e->getOption()->get(PREF_XML_RPC_USER), _e->getOption()->get(PREF_XML_RPC_PASSWD)); #ifdef HAVE_LIBZ _httpServer->enableGZip(); #else // !HAVE_LIBZ _httpServer->disableGZip(); #endif // !HAVE_LIBZ } HttpServerCommand::HttpServerCommand(cuid_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); } bool HttpServerCommand::execute() { if(_e->getRequestGroupMan()->downloadFinished() || _e->isHaltRequested()) { return true; } try { if(_socket->isReadable(0)) { _timeoutTimer = global::wallclock; SharedHandle header; header = _httpServer->receiveRequest(); if(header.isNull()) { _e->addCommand(this); return false; } if(!_httpServer->authenticate()) { _httpServer->disableKeepAlive(); _httpServer->feedResponse("401 Unauthorized", "WWW-Authenticate: Basic realm=\"aria2\"", "","text/html"); Command* command = new HttpServerResponseCommand(getCuid(), _httpServer, _e, _socket); _e->addCommand(command); _e->setNoWait(true); return true; } if(static_cast (_e->getOption()->getAsInt(PREF_XML_RPC_MAX_REQUEST_SIZE)) < _httpServer->getContentLength()) { getLogger()->info("Request too long. ContentLength=%s." " See --xml-rpc-max-request-size option to loose" " this limitation.", util::uitos(_httpServer->getContentLength()).c_str()); return true; } Command* command = new HttpServerBodyCommand(getCuid(), _httpServer, _e, _socket); _e->addCommand(command); _e->setNoWait(true); return true; } else { if(_timeoutTimer.difference(global::wallclock) >= 30) { getLogger()->info("HTTP request timeout."); return true; } else { _e->addCommand(this); return false; } } } catch(RecoverableException& e) { if(getLogger()->info()) { getLogger()->info("CUID#%s - Error occurred while reading HTTP request", e, util::itos(getCuid()).c_str()); } return true; } } } // namespace aria2