From b1edad42ffd144f449d9d4d81d414d6fb65cb46b Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 26 Nov 2008 15:22:54 +0000 Subject: 2008-11-27 Tatsuhiro Tsujikawa Fixed the bug that prevents aria2 from downloading 0-length files via HTTP/FTP. * src/DefaultBtContext.cc * src/DefaultBtContext.h * src/DownloadContext.h * src/FtpNegotiationCommand.cc * src/HttpResponseCommand.cc * src/HttpResponseCommand.h * src/RequestGroup.cc * src/SingleFileDownloadContext.cc * src/SingleFileDownloadContext.h * test/BtPostDownloadHandlerTest.cc * test/MetalinkPostDownloadHandlerTest.cc * test/MockBtContext.h --- src/FtpNegotiationCommand.cc | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) (limited to 'src/FtpNegotiationCommand.cc') diff --git a/src/FtpNegotiationCommand.cc b/src/FtpNegotiationCommand.cc index 63df6e2f..71ebc50c 100644 --- a/src/FtpNegotiationCommand.cc +++ b/src/FtpNegotiationCommand.cc @@ -333,10 +333,29 @@ bool FtpNegotiationCommand::onFileSizeDetermined(uint64_t totalLength) } if(totalLength == 0) { + if(e->option->getAsBool(PREF_FTP_PASV)) { + sequence = SEQ_SEND_PASV; + } else { + sequence = SEQ_PREPARE_SERVER_SOCKET; + } _requestGroup->initPieceStorage(); + if(dctx->knowsTotalLength() && + _requestGroup->downloadFinishedByFileLength()) { + sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED; + + poolConnection(); + + return false; + } _requestGroup->shouldCancelDownloadForSafety(); _requestGroup->getPieceStorage()->getDiskAdaptor()->initAndOpenFile(); + if(dctx->knowsTotalLength()) { + sequence = SEQ_DOWNLOAD_ALREADY_COMPLETED; + poolConnection(); + return false; + } + return true; } else { _requestGroup->initPieceStorage(); @@ -387,12 +406,10 @@ bool FtpNegotiationCommand::recvSize() { // command, resuming and segmented downloading are disabled when the first // contacted FTP server doesn't support it. if(_requestGroup->getPieceStorage().isNull()) { - - if(e->option->getAsBool(PREF_FTP_PASV)) { - sequence = SEQ_SEND_PASV; - } else { - sequence = SEQ_PREPARE_SERVER_SOCKET; - } + SingleFileDownloadContextHandle dctx = + dynamic_pointer_cast + (_requestGroup->getDownloadContext()); + dctx->markTotalLengthIsUnknown(); return onFileSizeDetermined(0); } -- cgit