/* */ #include "HttpNullDownloadCommand.h" #include "HttpConnection.h" #include "HttpResponse.h" #include "message.h" #include "SocketCore.h" #include "TransferEncoding.h" #include "DlRetryEx.h" #include "Request.h" #include "DownloadEngine.h" #include "Logger.h" #include "HttpRequest.h" #include "Segment.h" namespace aria2 { HttpNullDownloadCommand::HttpNullDownloadCommand (int cuid, const SharedHandle& req, RequestGroup* requestGroup, const SharedHandle& httpConnection, const SharedHandle& httpResponse, DownloadEngine* e, const SharedHandle& s): AbstractCommand(cuid, req, requestGroup, e, s), _httpConnection(httpConnection), _httpResponse(httpResponse), _totalLength(_httpResponse->getEntityLength()), _receivedBytes(0) {} HttpNullDownloadCommand::~HttpNullDownloadCommand() {} void HttpNullDownloadCommand::setTransferDecoder (const SharedHandle& transferDecoder) { _transferDecoder = transferDecoder; } bool HttpNullDownloadCommand::executeInternal() { const size_t BUFSIZE = 16*1024; unsigned char buf[BUFSIZE]; size_t bufSize = BUFSIZE; socket->readData(buf, bufSize); if(_transferDecoder.isNull()) { _receivedBytes += bufSize; } else { // _receivedBytes is not updated if transferEncoding is set. size_t infbufSize = 16*1024; unsigned char infbuf[infbufSize]; _transferDecoder->inflate(infbuf, infbufSize, buf, bufSize); } if(_totalLength != 0 && bufSize == 0) { throw DlRetryEx(EX_GOT_EOF); } if(bufSize == 0) { // Since this method is called by DownloadEngine only when the socket is // readable, bufSize == 0 means server shutdown the connection. // So socket cannot be reused in this case. return prepareForRetry(0); } else if((!_transferDecoder.isNull() && _transferDecoder->finished()) || (_transferDecoder.isNull() && _totalLength == _receivedBytes)) { if(!_transferDecoder.isNull()) _transferDecoder->end(); if(req->supportsPersistentConnection()) { std::pair peerInfo; socket->getPeerInfo(peerInfo); e->poolSocket(peerInfo.first, peerInfo.second, socket); } _httpResponse->processRedirect(); logger->info(MSG_REDIRECT, cuid, _httpResponse->getRedirectURI().c_str()); return prepareForRetry(0); } else { e->commands.push_back(this); return false; } } } // namespace aria2