diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-11-26 15:22:54 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2008-11-26 15:22:54 +0000 |
| commit | b1edad42ffd144f449d9d4d81d414d6fb65cb46b (patch) | |
| tree | dd22d491b29cda9dc34d61bc10fa19829b9a2529 /src/HttpResponseCommand.cc | |
| parent | b1eee48ee392feab38578283884b5ceb2a6cdd20 (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/HttpResponseCommand.cc')
| -rw-r--r-- | src/HttpResponseCommand.cc | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/src/HttpResponseCommand.cc b/src/HttpResponseCommand.cc index a79d3714..6313ff14 100644 --- a/src/HttpResponseCommand.cc +++ b/src/HttpResponseCommand.cc @@ -140,6 +140,11 @@ bool HttpResponseCommand::executeInternal() shouldInflateContentEncoding(httpResponse)) { // we ignore content-length when transfer-encoding is set dctx->setTotalLength(0); + if(req->getMethod() == Request::METHOD_GET && + (totalLength != 0 || + !httpResponse->getHttpHeader()->defined(HttpHeader::CONTENT_LENGTH))){ + dctx->markTotalLengthIsUnknown(); + } return handleOtherEncoding(httpResponse); } else { return handleDefaultEncoding(httpResponse); @@ -213,9 +218,7 @@ bool HttpResponseCommand::handleDefaultEncoding(const HttpResponseHandle& httpRe } prepareForNextAction(command); if(req->getMethod() == Request::METHOD_HEAD) { - if(req->supportsPersistentConnection()) { - e->poolSocket(req, isProxyDefined(), socket); - } + poolConnection(); req->setMethod(Request::METHOD_GET); } } catch(Exception& e) { @@ -261,17 +264,30 @@ static SharedHandle<Decoder> getContentEncodingDecoder } bool HttpResponseCommand::handleOtherEncoding(const HttpResponseHandle& httpResponse) { + // We assume that RequestGroup::getTotalLength() == 0 here HttpRequestHandle httpRequest = httpResponse->getHttpRequest(); if(req->getMethod() == Request::METHOD_HEAD) { - if(req->supportsPersistentConnection()) { - e->poolSocket(req, isProxyDefined(), socket); - } + poolConnection(); req->setMethod(Request::METHOD_GET); return prepareForRetry(0); } _requestGroup->initPieceStorage(); + + // For zero-length file, check existing file comparing its size + if(_requestGroup->getDownloadContext()->knowsTotalLength() && + _requestGroup->downloadFinishedByFileLength()) { + poolConnection(); + return true; + } + _requestGroup->shouldCancelDownloadForSafety(); _requestGroup->getPieceStorage()->getDiskAdaptor()->initAndOpenFile(); + + if(_requestGroup->getDownloadContext()->knowsTotalLength()) { + poolConnection(); + return true; + } + e->commands.push_back (createHttpDownloadCommand(httpResponse, getTransferEncodingDecoder(httpResponse), @@ -332,4 +348,11 @@ HttpDownloadCommand* HttpResponseCommand::createHttpDownloadCommand return command; } +void HttpResponseCommand::poolConnection() +{ + if(req->supportsPersistentConnection()) { + e->poolSocket(req, isProxyDefined(), socket); + } +} + } // namespace aria2 |
