diff options
| author | Nils Maier <maierman@web.de> | 2013-09-15 21:52:02 +0200 |
|---|---|---|
| committer | Nils Maier <maierman@web.de> | 2013-09-20 23:06:49 +0200 |
| commit | e2700f50a5d8da1596cefccc01d70aa4696e3f4a (patch) | |
| tree | 86821bba593efefe83fe31da28b7c6a944f5d171 /src/HttpDownloadCommand.cc | |
| parent | 29d569eef98cdcabe52c365e75ca4da2174d8bf0 (diff) | |
Code cleanup in Http*
Diffstat (limited to 'src/HttpDownloadCommand.cc')
| -rw-r--r-- | src/HttpDownloadCommand.cc | 107 |
1 files changed, 54 insertions, 53 deletions
diff --git a/src/HttpDownloadCommand.cc b/src/HttpDownloadCommand.cc index fb60add5..db57aa12 100644 --- a/src/HttpDownloadCommand.cc +++ b/src/HttpDownloadCommand.cc @@ -56,15 +56,14 @@ namespace aria2 { -HttpDownloadCommand::HttpDownloadCommand -(cuid_t cuid, - const std::shared_ptr<Request>& req, - const std::shared_ptr<FileEntry>& fileEntry, - RequestGroup* requestGroup, - std::unique_ptr<HttpResponse> httpResponse, - const std::shared_ptr<HttpConnection>& httpConnection, - DownloadEngine* e, - const std::shared_ptr<SocketCore>& socket) +HttpDownloadCommand::HttpDownloadCommand(cuid_t cuid, + const std::shared_ptr<Request>& req, + const std::shared_ptr<FileEntry>& fileEntry, + RequestGroup* requestGroup, + std::unique_ptr<HttpResponse> httpResponse, + const std::shared_ptr<HttpConnection>& httpConnection, + DownloadEngine* e, + const std::shared_ptr<SocketCore>& socket) : DownloadCommand(cuid, req, fileEntry, requestGroup, e, socket, httpConnection->getSocketRecvBuffer()), httpResponse_(std::move(httpResponse)), @@ -73,71 +72,73 @@ HttpDownloadCommand::HttpDownloadCommand HttpDownloadCommand::~HttpDownloadCommand() {} -bool HttpDownloadCommand::prepareForNextSegment() { +bool HttpDownloadCommand::prepareForNextSegment() +{ bool downloadFinished = getRequestGroup()->downloadFinished(); - if(getRequest()->isPipeliningEnabled() && !downloadFinished) { + if (getRequest()->isPipeliningEnabled() && !downloadFinished) { auto command = make_unique<HttpRequestCommand> (getCuid(), getRequest(), getFileEntry(), getRequestGroup(), httpConnection_, getDownloadEngine(), getSocket()); // Set proxy request here. aria2 sends the HTTP request specialized for // proxy. - if(resolveProxyMethod(getRequest()->getProtocol()) == V_GET) { + if (resolveProxyMethod(getRequest()->getProtocol()) == V_GET) { command->setProxyRequest(createProxyRequest()); } getDownloadEngine()->addCommand(std::move(command)); return true; - } else { - const std::string& streamFilterName = getStreamFilter()->getName(); - if(getRequest()->isPipeliningEnabled() || - (getRequest()->isKeepAliveEnabled() && - ( - // Make sure that all filters are finished to pool socket - (!util::endsWith(streamFilterName, SinkStreamFilter::NAME) && - getStreamFilter()->finished()) || - getRequestEndOffset() == - getFileEntry()->gtoloff(getSegments().front()->getPositionToWrite()) - ) + } + + const std::string& streamFilterName = getStreamFilter()->getName(); + if (getRequest()->isPipeliningEnabled() || + (getRequest()->isKeepAliveEnabled() && + ( + // Make sure that all filters are finished to pool socket + (!util::endsWith(streamFilterName, SinkStreamFilter::NAME) && + getStreamFilter()->finished()) || + getRequestEndOffset() == + getFileEntry()->gtoloff(getSegments().front()->getPositionToWrite()) ) - ) { - // TODO What if server sends EOF when non-SinkStreamFilter is - // used and server didn't send Connection: close? We end up to - // pool terminated socket. In HTTP/1.1, keep-alive is default, - // so closing connection without Connection: close header means - // that server is broken or not configured properly. - getDownloadEngine()->poolSocket - (getRequest(), createProxyRequest(), getSocket()); - } - // The request was sent assuming that server supported pipelining, but - // it turned out that server didn't support it. - // We detect this situation by comparing the end byte in range header - // of the response with the end byte of segment. - // If it is the same, HTTP negotiation is necessary for the next request. - if(!getRequest()->isPipeliningEnabled() && - getRequest()->isPipeliningHint() && - !downloadFinished) { - const std::shared_ptr<Segment>& segment = getSegments().front(); + ) + ) { + // TODO What if server sends EOF when non-SinkStreamFilter is + // used and server didn't send Connection: close? We end up to + // pool terminated socket. In HTTP/1.1, keep-alive is default, + // so closing connection without Connection: close header means + // that server is broken or not configured properly. + getDownloadEngine()->poolSocket(getRequest(), createProxyRequest(), + getSocket()); + } + + // The request was sent assuming that server supported pipelining, but + // it turned out that server didn't support it. + // We detect this situation by comparing the end byte in range header + // of the response with the end byte of segment. + // If it is the same, HTTP negotiation is necessary for the next request. + if (!getRequest()->isPipeliningEnabled() && + getRequest()->isPipeliningHint() && + !downloadFinished) { + const std::shared_ptr<Segment>& segment = getSegments().front(); - int64_t lastOffset =getFileEntry()->gtoloff - (std::min(segment->getPosition()+segment->getLength(), - getFileEntry()->getLastOffset())); - Range range = httpResponse_->getHttpHeader()->getRange(); - if(lastOffset == range.endByte + 1) { - return prepareForRetry(0); - } + int64_t lastOffset =getFileEntry()->gtoloff( + std::min(segment->getPosition()+segment->getLength(), + getFileEntry()->getLastOffset())); + auto range = httpResponse_->getHttpHeader()->getRange(); + if (lastOffset == range.endByte + 1) { + return prepareForRetry(0); } - return DownloadCommand::prepareForNextSegment(); } + + return DownloadCommand::prepareForNextSegment(); } int64_t HttpDownloadCommand::getRequestEndOffset() const { - int64_t endByte = httpResponse_->getHttpHeader()->getRange().endByte; - if(endByte > 0) { + auto endByte = httpResponse_->getHttpHeader()->getRange().endByte; + if (endByte > 0) { return endByte+1; - } else { - return endByte; } + return endByte; } } // namespace aria2 |
