mirror of https://github.com/aria2/aria2
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.ccpull/1/head
parent
86d4d1963a
commit
7375a778c4
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
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>
|
2010-10-02 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Code cleanup util::percentEncode()
|
Code cleanup util::percentEncode()
|
||||||
|
|
|
@ -174,6 +174,11 @@ protected:
|
||||||
*/
|
*/
|
||||||
void setWriteCheckSocketIf(const SharedHandle<SocketCore>& socket, bool pred);
|
void setWriteCheckSocketIf(const SharedHandle<SocketCore>& socket, bool pred);
|
||||||
|
|
||||||
|
time_t getTimeout() const
|
||||||
|
{
|
||||||
|
return timeout_;
|
||||||
|
}
|
||||||
|
|
||||||
void setTimeout(time_t timeout) { timeout_ = timeout; }
|
void setTimeout(time_t timeout) { timeout_ = timeout; }
|
||||||
|
|
||||||
void prepareForNextAction
|
void prepareForNextAction
|
||||||
|
@ -222,6 +227,11 @@ protected:
|
||||||
{
|
{
|
||||||
return requestGroup_->getPieceStorage();
|
return requestGroup_->getPieceStorage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Timer& getCheckPoint()
|
||||||
|
{
|
||||||
|
return checkPoint_;
|
||||||
|
}
|
||||||
public:
|
public:
|
||||||
AbstractCommand
|
AbstractCommand
|
||||||
(cuid_t cuid, const SharedHandle<Request>& req,
|
(cuid_t cuid, const SharedHandle<Request>& req,
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
#include "FileAllocationEntry.h"
|
#include "FileAllocationEntry.h"
|
||||||
#include "CheckIntegrityEntry.h"
|
#include "CheckIntegrityEntry.h"
|
||||||
#include "ServerStatMan.h"
|
#include "ServerStatMan.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
namespace aria2 {
|
namespace aria2 {
|
||||||
|
|
||||||
|
@ -75,23 +76,36 @@ bool FtpFinishDownloadCommand::execute()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
unsigned int status = ftpConnection_->receiveResponse();
|
if(readEventEnabled() || hupEventEnabled()) {
|
||||||
if(status == 0) {
|
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);
|
getDownloadEngine()->addCommand(this);
|
||||||
return false;
|
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) {
|
} 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()) {
|
if(getRequestGroup()->downloadFinished()) {
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue