/* */ #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" namespace aria2 { HttpServerCommand::HttpServerCommand(int32_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->option->get(PREF_XML_RPC_USER), _e->option->get(PREF_XML_RPC_PASSWD)); #ifdef HAVE_LIBZ _httpServer->enableGZip(); #else // !HAVE_LIBZ _httpServer->disableGZip(); #endif // !HAVE_LIBZ } 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); } bool HttpServerCommand::execute() { if(_e->_requestGroupMan->downloadFinished() || _e->isHaltRequested()) { return true; } try { if(_socket->isReadable(0)) { _timeout.reset(); SharedHandle header; header = _httpServer->receiveRequest(); if(header.isNull()) { _e->commands.push_back(this); return false; } if(!_httpServer->authenticate()) { _httpServer->disableKeepAlive(); _httpServer->feedResponse("401 Unauthorized", "WWW-Authenticate: Basic realm=\"aria2\"", "","text/html"); Command* command = new HttpServerResponseCommand(cuid, _httpServer, _e, _socket); _e->commands.push_back(command); _e->setNoWait(true); return true; } if(static_cast (_e->option->getAsInt(PREF_XML_RPC_MAX_REQUEST_SIZE)) < _httpServer->getContentLength()) { logger->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(cuid, _httpServer, _e, _socket); _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; } } } catch(RecoverableException& e) { logger->info("CUID#%d - Error occurred while reading HTTP request", e, cuid); return true; } } } // namespace aria2