/* */ #include "HttpRequestCommand.h" #include #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 "CookieStorage.h" #include "AuthConfigFactory.h" #include "AuthConfig.h" 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) { setTimeout(e->option->getAsInt(PREF_CONNECT_TIMEOUT)); disableReadCheckSocket(); setWriteCheckSocket(socket); } HttpRequestCommand::~HttpRequestCommand() {} static SharedHandle createHttpRequest(const SharedHandle& req, const SharedHandle& segment, uint64_t totalLength, const Option* option, const RequestGroup* rg, const SharedHandle& cookieStorage, const SharedHandle& authConfigFactory, const SharedHandle& proxyRequest) { 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)); httpRequest->setCookieStorage(cookieStorage); httpRequest->setAuthConfigFactory(authConfigFactory); httpRequest->setProxyRequest(proxyRequest); if(!rg->getAcceptFeatures().empty()) { const std::deque& acceptFeatures = rg->getAcceptFeatures(); std::string acceptFeaturesHeader = "Accept-Features: "; std::for_each(acceptFeatures.begin(), acceptFeatures.end(), StringAppend(acceptFeaturesHeader, ",")); httpRequest->addHeader(Util::trim(acceptFeaturesHeader, ",")); } httpRequest->addAcceptType(rg->getAcceptTypes().begin(), rg->getAcceptTypes().end()); return httpRequest; } bool HttpRequestCommand::executeInternal() { //socket->setBlockingMode(); if(req->getProtocol() == Request::PROTO_HTTPS) { socket->prepareSecureConnection(); if(!socket->initiateSecureConnection()) { setReadCheckSocketIf(socket, socket->wantRead()); setWriteCheckSocketIf(socket, socket->wantWrite()); e->commands.push_back(this); return false; } } if(_httpConnection->sendBufferIsEmpty()) { checkIfConnectionEstablished(socket); if(_segments.empty()) { HttpRequestHandle httpRequest (createHttpRequest(req, SharedHandle(), _requestGroup->getTotalLength(), e->option, _requestGroup, e->getCookieStorage(), e->getAuthConfigFactory(), _proxyRequest)); _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, e->getCookieStorage(), e->getAuthConfigFactory(), _proxyRequest)); _httpConnection->sendRequest(httpRequest); } } } } else { _httpConnection->sendPendingData(); } if(_httpConnection->sendBufferIsEmpty()) { Command* command = new HttpResponseCommand(cuid, req, _requestGroup, _httpConnection, e, socket); e->commands.push_back(command); return true; } else { setReadCheckSocketIf(socket, socket->wantRead()); setWriteCheckSocketIf(socket, socket->wantWrite()); e->commands.push_back(this); return false; } } void HttpRequestCommand::setProxyRequest (const SharedHandle& proxyRequest) { _proxyRequest = proxyRequest; } } // namespace aria2