summaryrefslogtreecommitdiff
path: root/src/FtpConnection.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-24 17:01:57 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-09-24 17:01:57 +0000
commit6bc233f414b74bf3acf4abf5d5655c236e78ae41 (patch)
tree3458e27259263587e4219c0c0da2f7c270f96d83 /src/FtpConnection.cc
parentd717ffb1d00511958234d1eb4df1d60382297374 (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.cc51
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