summaryrefslogtreecommitdiff
path: root/src/FtpNegotiationCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-26 15:22:54 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-26 15:22:54 +0000
commitb1edad42ffd144f449d9d4d81d414d6fb65cb46b (patch)
treedd22d491b29cda9dc34d61bc10fa19829b9a2529 /src/FtpNegotiationCommand.cc
parentb1eee48ee392feab38578283884b5ceb2a6cdd20 (diff)
2008-11-27 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
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
Diffstat (limited to 'src/FtpNegotiationCommand.cc')
-rw-r--r--src/FtpNegotiationCommand.cc29
1 files changed, 23 insertions, 6 deletions
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<SingleFileDownloadContext>
+ (_requestGroup->getDownloadContext());
+ dctx->markTotalLengthIsUnknown();
return onFileSizeDetermined(0);
}