summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-10-02 10:12:10 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-10-02 10:12:10 +0000
commit7375a778c4ad3acda07b138d8530974df490be29 (patch)
treeeeccdf18bd64ee163647d3a258505e30ce1f8819
parent86d4d1963a58e80642ef6e5986da54f68aa08b30 (diff)
2010-10-02 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug that FtpFinishDownloadCommand does not handle timeout. This means it waits for the remote server to send "226 Transfer Complete" message *without* its own timeout until the remote server shutdowns connection(we can detect EOF in this case). * src/AbstractCommand.h * src/FtpFinishDownloadCommand.cc
-rw-r--r--ChangeLog10
-rw-r--r--src/AbstractCommand.h10
-rw-r--r--src/FtpFinishDownloadCommand.cc40
3 files changed, 47 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 6320c86f..bd148e89 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2010-10-02 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
+ Fixed the bug that FtpFinishDownloadCommand does not handle
+ timeout. This means it waits for the remote server to send "226
+ Transfer Complete" message *without* its own timeout until the
+ remote server shutdowns connection(we can detect EOF in this
+ case).
+ * src/AbstractCommand.h
+ * src/FtpFinishDownloadCommand.cc
+
+2010-10-02 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
+
Code cleanup util::percentEncode()
* src/util.cc
diff --git a/src/AbstractCommand.h b/src/AbstractCommand.h
index 810ba487..9014c277 100644
--- a/src/AbstractCommand.h
+++ b/src/AbstractCommand.h
@@ -174,6 +174,11 @@ protected:
*/
void setWriteCheckSocketIf(const SharedHandle<SocketCore>& socket, bool pred);
+ time_t getTimeout() const
+ {
+ return timeout_;
+ }
+
void setTimeout(time_t timeout) { timeout_ = timeout; }
void prepareForNextAction
@@ -222,6 +227,11 @@ protected:
{
return requestGroup_->getPieceStorage();
}
+
+ Timer& getCheckPoint()
+ {
+ return checkPoint_;
+ }
public:
AbstractCommand
(cuid_t cuid, const SharedHandle<Request>& req,
diff --git a/src/FtpFinishDownloadCommand.cc b/src/FtpFinishDownloadCommand.cc
index f0436759..6578d67e 100644
--- a/src/FtpFinishDownloadCommand.cc
+++ b/src/FtpFinishDownloadCommand.cc
@@ -52,6 +52,7 @@
#include "FileAllocationEntry.h"
#include "CheckIntegrityEntry.h"
#include "ServerStatMan.h"
+#include "util.h"
namespace aria2 {
@@ -75,23 +76,36 @@ bool FtpFinishDownloadCommand::execute()
return true;
}
try {
- unsigned int status = ftpConnection_->receiveResponse();
- if(status == 0) {
+ if(readEventEnabled() || hupEventEnabled()) {
+ getCheckPoint().reset();
+ unsigned int status = ftpConnection_->receiveResponse();
+ if(status == 0) {
+ getDownloadEngine()->addCommand(this);
+ return false;
+ }
+ if(status == 226) {
+ if(getOption()->getAsBool(PREF_FTP_REUSE_CONNECTION)) {
+ std::map<std::string, std::string> options;
+ options["baseWorkingDir"] = ftpConnection_->getBaseWorkingDir();
+ getDownloadEngine()->poolSocket
+ (getRequest(), ftpConnection_->getUser(), createProxyRequest(),
+ getSocket(), options);
+ }
+ } else {
+ getLogger()->info("CUID#%s - Bad status for transfer complete.",
+ util::itos(getCuid()).c_str());
+ }
+ } else if(getCheckPoint().difference(global::wallclock) >= getTimeout()) {
+ getLogger()->info("CUID#%s - Timeout before receiving transfer complete.",
+ util::itos(getCuid()).c_str());
+ } else {
getDownloadEngine()->addCommand(this);
return false;
}
- if(status != 226) {
- throw DL_ABORT_EX(StringFormat(EX_BAD_STATUS, status).str());
- }
- if(getOption()->getAsBool(PREF_FTP_REUSE_CONNECTION)) {
- std::map<std::string, std::string> options;
- options["baseWorkingDir"] = ftpConnection_->getBaseWorkingDir();
- getDownloadEngine()->poolSocket
- (getRequest(), ftpConnection_->getUser(), createProxyRequest(),
- getSocket(), options);
- }
} catch(RecoverableException& e) {
- getLogger()->info(EX_EXCEPTION_CAUGHT, e);
+ getLogger()->info("CUID#%s - Exception was thrown, but download was"
+ " finished, so we can ignore the exception.",
+ e, util::itos(getCuid()).c_str());
}
if(getRequestGroup()->downloadFinished()) {
return true;