summaryrefslogtreecommitdiff
path: root/src/HttpResponseCommand.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/HttpResponseCommand.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/HttpResponseCommand.cc')
-rw-r--r--src/HttpResponseCommand.cc35
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