/* */ #include "HttpInitiateConnectionCommand.h" #include "HttpRequestCommand.h" #include "HttpProxyRequestCommand.h" #include "Util.h" #include "DlAbortEx.h" #include "DlRetryEx.h" #include "message.h" #include "prefs.h" HttpInitiateConnectionCommand::HttpInitiateConnectionCommand(int cuid, const RequestHandle req, DownloadEngine* e): AbstractCommand(cuid, req, e) { setTimeout(e->option->getAsInt(PREF_DNS_TIMEOUT)); disableReadCheckSocket(); disableWriteCheckSocket(); } HttpInitiateConnectionCommand::~HttpInitiateConnectionCommand() { #ifdef ENABLE_ASYNC_DNS disableNameResolverCheck(nameResolver); #endif // ENABLE_ASYNC_DNS } bool HttpInitiateConnectionCommand::executeInternal(Segment& segment) { string hostname; if(useProxy()) { hostname = e->option->get(PREF_HTTP_PROXY_HOST); } else { hostname = req->getHost(); } #ifdef ENABLE_ASYNC_DNS if(!Util::isNumbersAndDotsNotation(hostname)) { if(resolveHostname(hostname, nameResolver)) { hostname = nameResolver->getAddrString(); } else { e->commands.push_back(this); return false; } } #endif // ENABLE_ASYNC_DNS Command* command; if(useProxy()) { logger->info(MSG_CONNECTING_TO_SERVER, cuid, e->option->get(PREF_HTTP_PROXY_HOST).c_str(), e->option->getAsInt(PREF_HTTP_PROXY_PORT)); socket->establishConnection(hostname, e->option->getAsInt(PREF_HTTP_PROXY_PORT)); if(useProxyTunnel()) { command = new HttpProxyRequestCommand(cuid, req, e, socket); } else if(useProxyGet()) { command = new HttpRequestCommand(cuid, req, e, socket); } else { // TODO throw new DlAbortEx("ERROR"); } } else { logger->info(MSG_CONNECTING_TO_SERVER, cuid, req->getHost().c_str(), req->getPort()); socket->establishConnection(hostname, req->getPort()); command = new HttpRequestCommand(cuid, req, e, socket); } e->commands.push_back(command); return true; } bool HttpInitiateConnectionCommand::useProxy() { return e->option->get(PREF_HTTP_PROXY_ENABLED) == V_TRUE; } bool HttpInitiateConnectionCommand::useProxyGet() { return e->option->get(PREF_HTTP_PROXY_METHOD) == V_GET; } bool HttpInitiateConnectionCommand::useProxyTunnel() { return e->option->get(PREF_HTTP_PROXY_METHOD) == V_TUNNEL; }