diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-24 17:01:57 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-09-24 17:01:57 +0000 |
| commit | 6bc233f414b74bf3acf4abf5d5655c236e78ae41 (patch) | |
| tree | 3458e27259263587e4219c0c0da2f7c270f96d83 /src/FtpConnection.cc | |
| parent | d717ffb1d00511958234d1eb4df1d60382297374 (diff) | |
2008-09-25 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Issue PWD command first and get working directory and use it as
a prefix
for CWD command.
* src/DownloadEngine.cc
* src/DownloadEngine.h
* src/FtpConnection.cc
* src/FtpConnection.h
* src/FtpFinishDownloadCommand.cc
* src/FtpInitiateConnectionCommand.cc
* src/FtpNegotiationCommand.cc
* src/FtpNegotiationCommand.h
* test/FtpConnectionTest.cc
Diffstat (limited to 'src/FtpConnection.cc')
| -rw-r--r-- | src/FtpConnection.cc | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/FtpConnection.cc b/src/FtpConnection.cc index 35a437b9..09cdd6f6 100644 --- a/src/FtpConnection.cc +++ b/src/FtpConnection.cc @@ -61,7 +61,8 @@ FtpConnection::FtpConnection(int32_t cuid, const SocketHandle& socket, const RequestHandle& req, const Option* op): cuid(cuid), socket(socket), req(req), option(op), logger(LogFactory::getInstance()), - _socketBuffer(socket) {} + _socketBuffer(socket), + _baseWorkingDir("/") {} FtpConnection::~FtpConnection() {} @@ -108,10 +109,25 @@ bool FtpConnection::sendType() return _socketBuffer.sendBufferIsEmpty(); } +bool FtpConnection::sendPwd() +{ + if(_socketBuffer.sendBufferIsEmpty()) { + std::string request = "PWD\r\n"; + logger->info(MSG_SENDING_REQUEST, cuid, request.c_str()); + _socketBuffer.feedSendBuffer(request); + } + _socketBuffer.send(); + return _socketBuffer.sendBufferIsEmpty(); +} + bool FtpConnection::sendCwd() { if(_socketBuffer.sendBufferIsEmpty()) { - std::string request = "CWD "+Util::urldecode(req->getDir())+"\r\n"; + logger->info("CUID#%d - Using base working directory '%s'", + cuid, _baseWorkingDir.c_str()); + std::string request = "CWD "+ + (_baseWorkingDir == "/" ? "" : _baseWorkingDir)+ + Util::urldecode(req->getDir())+"\r\n"; logger->info(MSG_SENDING_REQUEST, cuid, request.c_str()); _socketBuffer.feedSendBuffer(request); } @@ -380,4 +396,35 @@ unsigned int FtpConnection::receivePasvResponse(std::pair<std::string, uint16_t> } } +unsigned int FtpConnection::receivePwdResponse(std::string& pwd) +{ + std::pair<unsigned int, std::string> response; + if(bulkReceiveResponse(response)) { + if(response.first == 257) { + std::string::size_type first; + std::string::size_type last; + + if((first = response.second.find("\"")) != std::string::npos && + (last = response.second.find("\"", ++first)) != std::string::npos) { + pwd = response.second.substr(first, last-first); + } else { + throw DlAbortEx(EX_INVALID_RESPONSE); + } + } + return response.first; + } else { + return 0; + } +} + +void FtpConnection::setBaseWorkingDir(const std::string& baseWorkingDir) +{ + _baseWorkingDir = baseWorkingDir; +} + +const std::string& FtpConnection::getBaseWorkingDir() const +{ + return _baseWorkingDir; +} + } // namespace aria2 |
