diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-04-17 13:19:17 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-04-17 13:19:17 +0000 |
| commit | 65a358c68b4e9411ac3a8667db3f3150f93a106d (patch) | |
| tree | 32e414e3e77a903251814de8c6ab838aa1f20d83 /src/HttpResponseCommand.cc | |
| parent | d2d4f67bbec16c45d1868fca307829f8992d1f9f (diff) | |
2009-04-17 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed segmentation fault when GZipDecoder::decode() returns 0
byte.
* src/DownloadCommand.cc
* src/bitfield.h
* test/bitfieldTest.cc
Fixed the bug that causes infinite loop if broken web server
returns chunked response without last "0" chunk-size marker and
closes connection.
* src/DownloadCommand.cc
Instantiate properly configured HttpDownloadCommand for
non-resumable downlaods.
* src/HttpResponseCommand.cc
Diffstat (limited to 'src/HttpResponseCommand.cc')
| -rw-r--r-- | src/HttpResponseCommand.cc | 26 |
1 files changed, 23 insertions, 3 deletions
diff --git a/src/HttpResponseCommand.cc b/src/HttpResponseCommand.cc index 62723a87..d1704418 100644 --- a/src/HttpResponseCommand.cc +++ b/src/HttpResponseCommand.cc @@ -68,6 +68,12 @@ namespace aria2 { +static SharedHandle<Decoder> getTransferEncodingDecoder +(const SharedHandle<HttpResponse>& httpResponse); + +static SharedHandle<Decoder> getContentEncodingDecoder +(const SharedHandle<HttpResponse>& httpResponse); + HttpResponseCommand::HttpResponseCommand(int32_t cuid, const RequestHandle& req, RequestGroup* requestGroup, @@ -147,6 +153,8 @@ bool HttpResponseCommand::executeInternal() if(req->getMethod() == Request::METHOD_GET && (totalLength != 0 || !httpResponse->getHttpHeader()->defined(HttpHeader::CONTENT_LENGTH))){ + // dctx->knowsTotalLength() == true only when server says the + // size of file is 0 explicitly. dctx->markTotalLengthIsUnknown(); } return handleOtherEncoding(httpResponse); @@ -158,8 +166,19 @@ bool HttpResponseCommand::executeInternal() _requestGroup->validateTotalLength(httpResponse->getEntityLength()); // update last modified time updateLastModifiedTime(httpResponse->getLastModifiedTime()); - - e->commands.push_back(createHttpDownloadCommand(httpResponse)); + if(_requestGroup->getTotalLength() == 0) { + // Since total length is unknown, the file size in previously + // failed download could be larger than the size this time. + // Also we can't resume in this case too. So truncate the file + // anyway. + _requestGroup->getPieceStorage()->getDiskAdaptor()->truncate(0); + e->commands.push_back + (createHttpDownloadCommand(httpResponse, + getTransferEncodingDecoder(httpResponse), + getContentEncodingDecoder(httpResponse))); + } else { + e->commands.push_back(createHttpDownloadCommand(httpResponse)); + } return true; } } @@ -299,11 +318,12 @@ bool HttpResponseCommand::handleOtherEncoding(const HttpResponseHandle& httpResp _requestGroup->shouldCancelDownloadForSafety(); _requestGroup->getPieceStorage()->getDiskAdaptor()->initAndOpenFile(); + // In this context, knowsTotalLength() is true only when the file is + // really zero-length. if(_requestGroup->getDownloadContext()->knowsTotalLength()) { poolConnection(); return true; } - e->commands.push_back (createHttpDownloadCommand(httpResponse, getTransferEncodingDecoder(httpResponse), |
