/* */ #include "FtpInitiateConnectionCommand.h" #include "NameResolver.h" #include "DownloadEngine.h" #include "RequestGroup.h" #include "Option.h" #include "Request.h" #include "FtpNegotiationCommand.h" #include "HttpRequest.h" #include "Segment.h" #include "HttpRequestCommand.h" #include "FtpTunnelRequestCommand.h" #include "DlAbortEx.h" #include "Logger.h" #include "message.h" #include "prefs.h" #include "Util.h" #include "HttpConnection.h" #include "Socket.h" namespace aria2 { FtpInitiateConnectionCommand::FtpInitiateConnectionCommand(int cuid, const RequestHandle& req, RequestGroup* requestGroup, DownloadEngine* e) :AbstractCommand(cuid, req, requestGroup, e) { setTimeout(e->option->getAsInt(PREF_DNS_TIMEOUT)); setStatusActive(); disableReadCheckSocket(); disableWriteCheckSocket(); } FtpInitiateConnectionCommand::~FtpInitiateConnectionCommand() { #ifdef ENABLE_ASYNC_DNS disableNameResolverCheck(nameResolver); #endif // ENABLE_ASYNC_DNS } bool FtpInitiateConnectionCommand::executeInternal() { std::string hostname; if(useHttpProxy()) { hostname = e->option->get(PREF_HTTP_PROXY_HOST); } else { hostname = req->getHost(); } if(!Util::isNumbersAndDotsNotation(hostname)) { if(resolveHostname(hostname, nameResolver)) { hostname = nameResolver->getAddrString(); } else { e->commands.push_back(this); return false; } } 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->establishConnection(hostname, e->option->getAsInt(PREF_HTTP_PROXY_PORT)); if(useHttpProxyGet()) { command = new HttpRequestCommand(cuid, req, _requestGroup, new HttpConnection(cuid, socket, e->option), e, socket); } else if(useHttpProxyConnect()) { command = new FtpTunnelRequestCommand(cuid, req, _requestGroup, 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 FtpNegotiationCommand(cuid, req, _requestGroup, e, socket); } e->commands.push_back(command); return true; } bool FtpInitiateConnectionCommand::useHttpProxy() const { return e->option->get(PREF_HTTP_PROXY_ENABLED) == V_TRUE; } bool FtpInitiateConnectionCommand::useHttpProxyGet() const { return useHttpProxy() && e->option->get(PREF_FTP_VIA_HTTP_PROXY) == V_GET; } bool FtpInitiateConnectionCommand::useHttpProxyConnect() const { return useHttpProxy() && e->option->get(PREF_FTP_VIA_HTTP_PROXY) == V_TUNNEL; } #ifdef ENABLE_ASYNC_DNS bool FtpInitiateConnectionCommand::nameResolveFinished() const { return nameResolver->getStatus() == NameResolver::STATUS_SUCCESS || nameResolver->getStatus() == NameResolver::STATUS_ERROR; } #endif // ENABLE_ASYNC_DNS } // namespace aria2