/* */ #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" #include "A2STR.h" #include "DownloadContext.h" namespace aria2 { HttpInitiateConnectionCommand::HttpInitiateConnectionCommand (int cuid, const RequestHandle& req, const SharedHandle& fileEntry, RequestGroup* requestGroup, DownloadEngine* e): InitiateConnectionCommand(cuid, req, fileEntry, requestGroup, e) {} HttpInitiateConnectionCommand::~HttpInitiateConnectionCommand() {} Command* HttpInitiateConnectionCommand::createNextCommand (const std::string& hostname, const std::string& addr, uint16_t port, const std::deque& resolvedAddresses, const SharedHandle& proxyRequest) { Command* command; if(!proxyRequest.isNull()) { SharedHandle pooledSocket = e->popPooledSocket(req->getHost(), req->getPort()); std::string proxyMethod = resolveProxyMethod(req->getProtocol()); if(pooledSocket.isNull()) { logger->info(MSG_CONNECTING_TO_SERVER, cuid, addr.c_str(), port); socket.reset(new SocketCore()); socket->establishConnection(addr, port); if(proxyMethod == V_TUNNEL) { HttpProxyRequestCommand* c = new HttpProxyRequestCommand(cuid, req, _fileEntry, _requestGroup, e, proxyRequest, socket); c->setConnectedAddr(hostname, addr, port); command = c; } else if(proxyMethod == V_GET) { SharedHandle httpConnection (new HttpConnection(cuid, socket, getOption().get())); HttpRequestCommand* c = new HttpRequestCommand(cuid, req, _fileEntry, _requestGroup, httpConnection, e, socket); c->setConnectedAddr(hostname, addr, port); c->setProxyRequest(proxyRequest); command = c; } else { // TODO throw DL_ABORT_EX("ERROR"); } } else { SharedHandle httpConnection (new HttpConnection(cuid, pooledSocket, getOption().get())); HttpRequestCommand* c = new HttpRequestCommand(cuid, req, _fileEntry, _requestGroup, httpConnection, e, pooledSocket); if(proxyMethod == V_GET) { c->setProxyRequest(proxyRequest); } command = c; } } else { SharedHandle pooledSocket = e->popPooledSocket(resolvedAddresses, req->getPort()); if(pooledSocket.isNull()) { logger->info(MSG_CONNECTING_TO_SERVER, cuid, addr.c_str(), port); socket.reset(new SocketCore()); socket->establishConnection(addr, port); } else { socket = pooledSocket; } SharedHandle httpConnection(new HttpConnection(cuid, socket, getOption().get())); HttpRequestCommand* c = new HttpRequestCommand(cuid, req, _fileEntry, _requestGroup, httpConnection, e, socket); if(pooledSocket.isNull()) { c->setConnectedAddr(hostname, addr, port); } command = c; } return command; } } // namespace aria2