/* */ #include "HttpInitiateConnectionCommand.h" #include "Request.h" #include "DownloadEngine.h" #include "HttpConnection.h" #include "HttpRequest.h" #include "Segment.h" #include "HttpRequestCommand.h" #include "HttpProxyRequestCommand.h" #include "DlAbortEx.h" #include "Option.h" #include "Logger.h" #include "Socket.h" #include "message.h" #include "prefs.h" namespace aria2 { HttpInitiateConnectionCommand::HttpInitiateConnectionCommand (int cuid, const RequestHandle& req, RequestGroup* requestGroup, DownloadEngine* e): InitiateConnectionCommand(cuid, req, requestGroup, e) {} HttpInitiateConnectionCommand::~HttpInitiateConnectionCommand() {} Command* HttpInitiateConnectionCommand::createNextCommand (const std::deque& resolvedAddresses) { Command* command; if(useHTTPProxy()) { logger->info(MSG_CONNECTING_TO_SERVER, cuid, e->option->get(PREF_HTTP_PROXY_HOST).c_str(), e->option->getAsInt(PREF_HTTP_PROXY_PORT)); socket.reset(new SocketCore()); socket->establishConnection(resolvedAddresses.front(), e->option->getAsInt(PREF_HTTP_PROXY_PORT)); if(useProxyTunnel()) { command = new HttpProxyRequestCommand(cuid, req, _requestGroup, e, socket); } else if(useProxyGet()) { SharedHandle httpConnection(new HttpConnection(cuid, socket, e->option)); command = new HttpRequestCommand(cuid, req, _requestGroup, httpConnection, e, socket); } else { // TODO throw DlAbortEx("ERROR"); } } else { SharedHandle pooledSocket = e->popPooledSocket(resolvedAddresses, req->getPort()); if(pooledSocket.isNull()) { logger->info(MSG_CONNECTING_TO_SERVER, cuid, req->getHost().c_str(), req->getPort()); socket.reset(new SocketCore()); socket->establishConnection(resolvedAddresses.front(), req->getPort()); } else { socket = pooledSocket; } SharedHandle httpConnection(new HttpConnection(cuid, socket, e->option)); command = new HttpRequestCommand(cuid, req, _requestGroup, httpConnection, e, socket); } return command; } bool HttpInitiateConnectionCommand::useProxyGet() const { return e->option->get(PREF_HTTP_PROXY_METHOD) == V_GET; } bool HttpInitiateConnectionCommand::useProxyTunnel() const { return e->option->get(PREF_HTTP_PROXY_METHOD) == V_TUNNEL; } } // namespace aria2