From 522ae80fd463bfe1be239397984ed71e9cff94bd Mon Sep 17 00:00:00 2001 From: Nils Maier Date: Sat, 24 Aug 2013 20:02:13 +0200 Subject: [PATCH] Fix no-return warning in FtpInitiateConnectionCommand ... and untangle code a bit while at it. --- src/FtpInitiateConnectionCommand.cc | 264 +++++++++++++++------------- src/FtpInitiateConnectionCommand.h | 9 + 2 files changed, 152 insertions(+), 121 deletions(-) diff --git a/src/FtpInitiateConnectionCommand.cc b/src/FtpInitiateConnectionCommand.cc index 4520d91e..ac704b19 100644 --- a/src/FtpInitiateConnectionCommand.cc +++ b/src/FtpInitiateConnectionCommand.cc @@ -73,133 +73,155 @@ FtpInitiateConnectionCommand::FtpInitiateConnectionCommand FtpInitiateConnectionCommand::~FtpInitiateConnectionCommand() {} +std::unique_ptr FtpInitiateConnectionCommand::createNextCommandProxied +(const std::string& hostname, const std::string& addr, uint16_t port, + const std::vector& resolvedAddresses, + const std::shared_ptr& proxyRequest) +{ + std::string options; + std::shared_ptr pooledSocket; + std::string proxyMethod = resolveProxyMethod(getRequest()->getProtocol()); + + if(proxyMethod == V_GET) { + pooledSocket = getDownloadEngine()->popPooledSocket + (getRequest()->getHost(), getRequest()->getPort(), + proxyRequest->getHost(), proxyRequest->getPort()); + } + else { + pooledSocket = getDownloadEngine()->popPooledSocket + (options, getRequest()->getHost(), getRequest()->getPort(), + getDownloadEngine()->getAuthConfigFactory()->createAuthConfig + (getRequest(), getOption().get())->getUser(), + proxyRequest->getHost(), proxyRequest->getPort()); + } + + if(!pooledSocket) { + A2_LOG_INFO(fmt(MSG_CONNECTING_TO_SERVER, + getCuid(), addr.c_str(), port)); + createSocket(); + getSocket()->establishConnection(addr, port); + + getRequest()->setConnectedAddrInfo(hostname, addr, port); + + auto c = make_unique(getCuid(), + getRequest(), + proxyRequest, + getFileEntry(), + getRequestGroup(), + getDownloadEngine(), + getSocket()); + if(proxyMethod == V_GET) { + // Use GET for FTP via HTTP proxy. + getRequest()->setMethod(Request::METHOD_GET); + std::shared_ptr chain + (new HttpRequestConnectChain()); + c->setControlChain(chain); + } else if(proxyMethod == V_TUNNEL) { + std::shared_ptr chain + (new FtpTunnelRequestConnectChain()); + c->setControlChain(chain); + } else { + // Unreachable + assert(0); + return nullptr; + } + setupBackupConnection(hostname, addr, port, c.get()); + return std::move(c); + } + + setConnectedAddrInfo(getRequest(), hostname, pooledSocket); + if(proxyMethod == V_TUNNEL) { + // options contains "baseWorkingDir" + return make_unique + (getCuid(), + getRequest(), + getFileEntry(), + getRequestGroup(), + getDownloadEngine(), + pooledSocket, + FtpNegotiationCommand::SEQ_SEND_CWD_PREP, + options); + } + + if(proxyMethod != V_GET) { + assert(0); + return nullptr; + } + + // Use GET for FTP via HTTP proxy. + getRequest()->setMethod(Request::METHOD_GET); + std::shared_ptr socketRecvBuffer + (new SocketRecvBuffer(pooledSocket)); + std::shared_ptr hc + (new HttpConnection(getCuid(), pooledSocket, socketRecvBuffer)); + + auto c = make_unique(getCuid(), + getRequest(), + getFileEntry(), + getRequestGroup(), + hc, + getDownloadEngine(), + pooledSocket); + c->setProxyRequest(proxyRequest); + return std::move(c); +} + +std::unique_ptr FtpInitiateConnectionCommand::createNextCommandPlain +(const std::string& hostname, const std::string& addr, uint16_t port, + const std::vector& resolvedAddresses) +{ + std::string options; + std::shared_ptr pooledSocket = + getDownloadEngine()->popPooledSocket + (options, resolvedAddresses, + getRequest()->getPort(), + getDownloadEngine()->getAuthConfigFactory()->createAuthConfig + (getRequest(), getOption().get())->getUser()); + + if(!pooledSocket) { + A2_LOG_INFO(fmt(MSG_CONNECTING_TO_SERVER, + getCuid(), addr.c_str(), port)); + createSocket(); + getSocket()->establishConnection(addr, port); + getRequest()->setConnectedAddrInfo(hostname, addr, port); + auto c = make_unique(getCuid(), + getRequest(), + nullptr, + getFileEntry(), + getRequestGroup(), + getDownloadEngine(), + getSocket()); + std::shared_ptr chain + (new FtpNegotiationConnectChain()); + c->setControlChain(chain); + setupBackupConnection(hostname, addr, port, c.get()); + return std::move(c); + } + + // options contains "baseWorkingDir" + auto command = make_unique + (getCuid(), + getRequest(), + getFileEntry(), + getRequestGroup(), + getDownloadEngine(), + pooledSocket, + FtpNegotiationCommand::SEQ_SEND_CWD_PREP, + options); + setConnectedAddrInfo(getRequest(), hostname, pooledSocket); + return std::move(command); +} + std::unique_ptr FtpInitiateConnectionCommand::createNextCommand (const std::string& hostname, const std::string& addr, uint16_t port, const std::vector& resolvedAddresses, const std::shared_ptr& proxyRequest) { - if(proxyRequest) { - std::string options; - std::shared_ptr pooledSocket; - std::string proxyMethod = resolveProxyMethod(getRequest()->getProtocol()); - if(proxyMethod == V_GET) { - pooledSocket = getDownloadEngine()->popPooledSocket - (getRequest()->getHost(), getRequest()->getPort(), - proxyRequest->getHost(), proxyRequest->getPort()); - } else { - pooledSocket = getDownloadEngine()->popPooledSocket - (options, getRequest()->getHost(), getRequest()->getPort(), - getDownloadEngine()->getAuthConfigFactory()->createAuthConfig - (getRequest(), getOption().get())->getUser(), - proxyRequest->getHost(), proxyRequest->getPort()); - } - if(!pooledSocket) { - A2_LOG_INFO(fmt(MSG_CONNECTING_TO_SERVER, - getCuid(), addr.c_str(), port)); - createSocket(); - getSocket()->establishConnection(addr, port); - - getRequest()->setConnectedAddrInfo(hostname, addr, port); - - auto c = make_unique(getCuid(), - getRequest(), - proxyRequest, - getFileEntry(), - getRequestGroup(), - getDownloadEngine(), - getSocket()); - if(proxyMethod == V_GET) { - // Use GET for FTP via HTTP proxy. - getRequest()->setMethod(Request::METHOD_GET); - std::shared_ptr chain - (new HttpRequestConnectChain()); - c->setControlChain(chain); - } else if(proxyMethod == V_TUNNEL) { - std::shared_ptr chain - (new FtpTunnelRequestConnectChain()); - c->setControlChain(chain); - } else { - // Unreachable - assert(0); - } - setupBackupConnection(hostname, addr, port, c.get()); - return std::move(c); - } else { - setConnectedAddrInfo(getRequest(), hostname, pooledSocket); - if(proxyMethod == V_TUNNEL) { - // options contains "baseWorkingDir" - return make_unique - (getCuid(), - getRequest(), - getFileEntry(), - getRequestGroup(), - getDownloadEngine(), - pooledSocket, - FtpNegotiationCommand::SEQ_SEND_CWD_PREP, - options); - } else if(proxyMethod == V_GET) { - // Use GET for FTP via HTTP proxy. - getRequest()->setMethod(Request::METHOD_GET); - std::shared_ptr socketRecvBuffer - (new SocketRecvBuffer(pooledSocket)); - std::shared_ptr hc - (new HttpConnection(getCuid(), pooledSocket, socketRecvBuffer)); - - auto c = make_unique(getCuid(), - getRequest(), - getFileEntry(), - getRequestGroup(), - hc, - getDownloadEngine(), - pooledSocket); - c->setProxyRequest(proxyRequest); - return std::move(c); - } else { - // Unreachable - assert(0); - } - } - } else { - std::string options; - std::shared_ptr pooledSocket = - getDownloadEngine()->popPooledSocket - (options, resolvedAddresses, - getRequest()->getPort(), - getDownloadEngine()->getAuthConfigFactory()->createAuthConfig - (getRequest(), getOption().get())->getUser()); - if(!pooledSocket) { - A2_LOG_INFO(fmt(MSG_CONNECTING_TO_SERVER, - getCuid(), addr.c_str(), port)); - createSocket(); - getSocket()->establishConnection(addr, port); - getRequest()->setConnectedAddrInfo(hostname, addr, port); - auto c = make_unique(getCuid(), - getRequest(), - proxyRequest, // must be null - getFileEntry(), - getRequestGroup(), - getDownloadEngine(), - getSocket()); - std::shared_ptr chain - (new FtpNegotiationConnectChain()); - c->setControlChain(chain); - setupBackupConnection(hostname, addr, port, c.get()); - return std::move(c); - } else { - // options contains "baseWorkingDir" - auto command = make_unique - (getCuid(), - getRequest(), - getFileEntry(), - getRequestGroup(), - getDownloadEngine(), - pooledSocket, - FtpNegotiationCommand::SEQ_SEND_CWD_PREP, - options); - setConnectedAddrInfo(getRequest(), hostname, pooledSocket); - return std::move(command); - } + if (proxyRequest) { + return createNextCommandProxied(hostname, addr, port, resolvedAddresses, + proxyRequest); } + return createNextCommandPlain(hostname, addr, port, resolvedAddresses); } } // namespace aria2 diff --git a/src/FtpInitiateConnectionCommand.h b/src/FtpInitiateConnectionCommand.h index 4d4f482b..d0843392 100644 --- a/src/FtpInitiateConnectionCommand.h +++ b/src/FtpInitiateConnectionCommand.h @@ -40,6 +40,15 @@ namespace aria2 { class FtpInitiateConnectionCommand : public InitiateConnectionCommand { +private: + virtual std::unique_ptr createNextCommandProxied + (const std::string& hostname, const std::string& addr, uint16_t port, + const std::vector& resolvedAddresses, + const std::shared_ptr& proxyRequest); + + virtual std::unique_ptr createNextCommandPlain + (const std::string& hostname, const std::string& addr, uint16_t port, + const std::vector& resolvedAddresses); protected: virtual std::unique_ptr createNextCommand (const std::string& hostname, const std::string& addr, uint16_t port,