/* */ #include "HttpRequestCommand.h" #include "Request.h" #include "DownloadEngine.h" #include "RequestGroup.h" #include "HttpResponseCommand.h" #include "HttpConnection.h" #include "HttpRequest.h" #include "SegmentMan.h" #include "Segment.h" #include "Option.h" #include "Socket.h" #include "prefs.h" #include "a2functional.h" #include "Util.h" #include namespace aria2 { HttpRequestCommand::HttpRequestCommand (int cuid, const RequestHandle& req, RequestGroup* requestGroup, const HttpConnectionHandle& httpConnection, DownloadEngine* e, const SocketHandle& s) :AbstractCommand(cuid, req, requestGroup, e, s), _httpConnection(httpConnection) { disableReadCheckSocket(); setWriteCheckSocket(socket); } HttpRequestCommand::~HttpRequestCommand() {} static SharedHandle createHttpRequest(const SharedHandle& req, const SharedHandle& segment, uint64_t totalLength, const Option* option, const RequestGroup* rg) { HttpRequestHandle httpRequest(new HttpRequest()); httpRequest->setUserAgent(option->get(PREF_USER_AGENT)); httpRequest->setRequest(req); httpRequest->setSegment(segment); httpRequest->setEntityLength(totalLength); httpRequest->addHeader(option->get(PREF_HEADER)); if(rg->getAcceptFeatures().size()) { const std::deque& acceptFeatures = rg->getAcceptFeatures(); std::string acceptFeaturesHeader = "Accept-Features: "+ Util::trim (std::accumulate(acceptFeatures.begin()+1, acceptFeatures.end(), *acceptFeatures.begin(), Concat(",")), ","); httpRequest->addHeader(acceptFeaturesHeader); } httpRequest->addAcceptType(rg->getAcceptTypes().begin(), rg->getAcceptTypes().end()); httpRequest->configure(option); return httpRequest; } bool HttpRequestCommand::executeInternal() { socket->setBlockingMode(); if(req->getProtocol() == "https") { socket->initiateSecureConnection(); } if(_segments.empty()) { HttpRequestHandle httpRequest (createHttpRequest(req, SharedHandle(), _requestGroup->getTotalLength(), e->option, _requestGroup)); _httpConnection->sendRequest(httpRequest); } else { for(Segments::iterator itr = _segments.begin(); itr != _segments.end(); ++itr) { const SegmentHandle& segment = *itr; if(!_httpConnection->isIssued(segment)) { HttpRequestHandle httpRequest (createHttpRequest(req, segment, _requestGroup->getTotalLength(), e->option, _requestGroup)); _httpConnection->sendRequest(httpRequest); } } } Command* command = new HttpResponseCommand(cuid, req, _requestGroup, _httpConnection, e, socket); e->commands.push_back(command); return true; } } // namespace aria2