/* */ #include "FtpInitiateConnectionCommand.h" #include #include "DownloadEngine.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 "HttpConnection.h" #include "Socket.h" #include "DownloadContext.h" #include "util.h" #include "AuthConfigFactory.h" #include "AuthConfig.h" namespace aria2 { FtpInitiateConnectionCommand::FtpInitiateConnectionCommand (cuid_t cuid, const SharedHandle& req, const SharedHandle& fileEntry, RequestGroup* requestGroup, DownloadEngine* e) :InitiateConnectionCommand(cuid, req, fileEntry, requestGroup, e) {} FtpInitiateConnectionCommand::~FtpInitiateConnectionCommand() {} Command* FtpInitiateConnectionCommand::createNextCommand (const std::string& hostname, const std::string& addr, uint16_t port, const std::vector& resolvedAddresses, const SharedHandle& proxyRequest) { Command* command; if(!proxyRequest.isNull()) { std::map options; SharedHandle pooledSocket; std::string proxyMethod = resolveProxyMethod(req->getProtocol()); if(proxyMethod == V_GET) { pooledSocket = e->popPooledSocket(req->getHost(), req->getPort()); } else { pooledSocket = e->popPooledSocket (options, req->getHost(), req->getPort(), e->getAuthConfigFactory()->createAuthConfig (req, getOption().get())->getUser()); } if(pooledSocket.isNull()) { if(logger->info()) { logger->info(MSG_CONNECTING_TO_SERVER, util::itos(cuid).c_str(), addr.c_str(), port); } socket.reset(new SocketCore()); socket->establishConnection(addr, port); if(proxyMethod == V_GET) { // Use GET for FTP via HTTP proxy. req->setMethod(Request::METHOD_GET); SharedHandle hc (new HttpConnection(cuid, socket, getOption().get())); HttpRequestCommand* c = new HttpRequestCommand(cuid, req, _fileEntry, _requestGroup, hc, e, socket); c->setConnectedAddr(hostname, addr, port); c->setProxyRequest(proxyRequest); command = c; } else if(proxyMethod == V_TUNNEL) { FtpTunnelRequestCommand* c = new FtpTunnelRequestCommand(cuid, req, _fileEntry, _requestGroup, e, proxyRequest, socket); c->setConnectedAddr(hostname, addr, port); command = c; } else { // TODO throw DL_ABORT_EX("ERROR"); } } else { if(proxyMethod == V_TUNNEL) { command = new FtpNegotiationCommand(cuid, req, _fileEntry, _requestGroup, e, pooledSocket, FtpNegotiationCommand::SEQ_SEND_CWD, options["baseWorkingDir"]); } else if(proxyMethod == V_GET) { // Use GET for FTP via HTTP proxy. req->setMethod(Request::METHOD_GET); SharedHandle hc (new HttpConnection(cuid, pooledSocket, getOption().get())); HttpRequestCommand* c = new HttpRequestCommand(cuid, req, _fileEntry, _requestGroup, hc, e, pooledSocket); c->setProxyRequest(proxyRequest); command = c; } else { // TODO throw DL_ABORT_EX("ERROR"); } } } else { std::map options; SharedHandle pooledSocket = e->popPooledSocket(options, resolvedAddresses, req->getPort(), e->getAuthConfigFactory()->createAuthConfig (req, getOption().get())->getUser()); if(pooledSocket.isNull()) { if(logger->info()) { logger->info(MSG_CONNECTING_TO_SERVER, util::itos(cuid).c_str(), addr.c_str(), port); } socket.reset(new SocketCore()); socket->establishConnection(addr, port); FtpNegotiationCommand* c = new FtpNegotiationCommand(cuid, req, _fileEntry, _requestGroup, e, socket); c->setConnectedAddr(hostname, addr, port); command = c; } else { command = new FtpNegotiationCommand(cuid, req, _fileEntry, _requestGroup, e, pooledSocket, FtpNegotiationCommand::SEQ_SEND_CWD, options["baseWorkingDir"]); } } return command; } } // namespace aria2