From 3c877a9df4693004cd28aefe38c790907ffc5ddd Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Tue, 5 May 2009 15:19:02 +0000 Subject: [PATCH] 2009-05-06 Tatsuhiro Tsujikawa Supported segmented downloading with chunked transfer encoding and content-length. * src/DownloadCommand.cc * src/HttpResponseCommand.cc --- ChangeLog | 7 +++++++ src/DownloadCommand.cc | 3 +++ src/HttpResponseCommand.cc | 10 ++++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9c8d18ed..3f8e0e8e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-05-06 Tatsuhiro Tsujikawa + + Supported segmented downloading with chunked transfer encoding and + content-length. + * src/DownloadCommand.cc + * src/HttpResponseCommand.cc + 2009-05-05 Tatsuhiro Tsujikawa Bump up version number to 1.3.3 diff --git a/src/DownloadCommand.cc b/src/DownloadCommand.cc index 8b6b05ac..14a31834 100644 --- a/src/DownloadCommand.cc +++ b/src/DownloadCommand.cc @@ -165,6 +165,7 @@ bool DownloadCommand::executeInternal() { _requestGroup->getSegmentMan()->updateDownloadSpeedFor(peerStat); bool segmentComplete = false; + // Note that GrowSegment::complete() always returns false. if(_transferEncodingDecoder.isNull() && _contentEncodingDecoder.isNull()) { if(segment->complete()) { segmentComplete = true; @@ -172,6 +173,8 @@ bool DownloadCommand::executeInternal() { !socket->wantRead() && !socket->wantWrite()) { segmentComplete = true; } + } else if(!_transferEncodingDecoder.isNull() && segment->complete()) { + segmentComplete = true; } else if((_transferEncodingDecoder.isNull() || _transferEncodingDecoder->finished()) && (_contentEncodingDecoder.isNull() || diff --git a/src/HttpResponseCommand.cc b/src/HttpResponseCommand.cc index d1704418..487593e8 100644 --- a/src/HttpResponseCommand.cc +++ b/src/HttpResponseCommand.cc @@ -146,9 +146,10 @@ bool HttpResponseCommand::executeInternal() // update last modified time updateLastModifiedTime(httpResponse->getLastModifiedTime()); - if(totalLength == 0 || httpResponse->isTransferEncodingSpecified() || - shouldInflateContentEncoding(httpResponse)) { - // we ignore content-length when transfer-encoding is set + // If both transfer-encoding and total length is specified, we + // assume we can do segmented downloading + if(totalLength == 0 || shouldInflateContentEncoding(httpResponse)) { + // we ignore content-length when inflate is required dctx->setTotalLength(0); if(req->getMethod() == Request::METHOD_GET && (totalLength != 0 || @@ -177,7 +178,8 @@ bool HttpResponseCommand::executeInternal() getTransferEncodingDecoder(httpResponse), getContentEncodingDecoder(httpResponse))); } else { - e->commands.push_back(createHttpDownloadCommand(httpResponse)); + e->commands.push_back(createHttpDownloadCommand(httpResponse, + getTransferEncodingDecoder(httpResponse))); } return true; }