diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-31 11:17:38 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-31 11:17:38 +0000 |
| commit | 5cb09dabf5994c861b0bc794f0885f9b6758c216 (patch) | |
| tree | a06930a05088378e435d43f501bd8f95fb0bcce8 /src/FileEntry.cc | |
| parent | 3434be81101347dfbed4c50d46be6360f1ca074b (diff) | |
2010-08-31 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Fixed the bug which prevents HTTP redirection from working when
downloading multiple files from same host.
* src/AbstractCommand.cc
* src/FileEntry.cc
Diffstat (limited to 'src/FileEntry.cc')
| -rw-r--r-- | src/FileEntry.cc | 107 |
1 files changed, 40 insertions, 67 deletions
diff --git a/src/FileEntry.cc b/src/FileEntry.cc index e8c26101..e781344e 100644 --- a/src/FileEntry.cc +++ b/src/FileEntry.cc @@ -125,78 +125,51 @@ FileEntry::getRequest const std::string& method) { SharedHandle<Request> req; - Request r; - std::vector<std::string> inFlightHosts; - enumerateInFlightHosts(inFlightRequests_.begin(), inFlightRequests_.end(), - std::back_inserter(inFlightHosts)); - - if(!requestPool_.empty()) { - for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(), - eoi = requestPool_.end(); i != eoi; ++i) { - r.setUri((*i)->getUri()); - if(findSecond(usedHosts.begin(), usedHosts.end(), r.getHost()) != - usedHosts.end()) { - continue; - } - if(std::count(inFlightHosts.begin(), inFlightHosts.end(), r.getHost()) - >= static_cast<int>(maxConnectionPerServer_)) { - continue; - } - req = *i; - requestPool_.erase(i); - inFlightRequests_.push_back(req); - return req; - } - } - - for(int g = 0; g < 2; ++g) { - std::vector<std::string> pending; - std::vector<std::string> ignoreHost; - while(1) { - std::string uri = selector->select(this, usedHosts); - if(uri.empty()) { - break; - } - req.reset(new Request()); - if(req->setUri(uri)) { - if(std::count(inFlightHosts.begin(), inFlightHosts.end(),req->getHost()) - >= static_cast<int>(maxConnectionPerServer_)) { - pending.push_back(uri); - ignoreHost.push_back(req->getHost()); + if(requestPool_.empty()) { + std::vector<std::string> inFlightHosts; + enumerateInFlightHosts(inFlightRequests_.begin(), inFlightRequests_.end(), + std::back_inserter(inFlightHosts)); + for(int g = 0; g < 2; ++g) { + std::vector<std::string> pending; + std::vector<std::string> ignoreHost; + while(1) { + std::string uri = selector->select(this, usedHosts); + if(uri.empty()) { + break; + } + req.reset(new Request()); + if(req->setUri(uri)) { + if(std::count(inFlightHosts.begin(), + inFlightHosts.end(),req->getHost()) + >= static_cast<int>(maxConnectionPerServer_)) { + pending.push_back(uri); + ignoreHost.push_back(req->getHost()); + req.reset(); + continue; + } + req->setReferer(referer); + req->setMethod(method); + spentUris_.push_back(uri); + inFlightRequests_.push_back(req); + break; + } else { req.reset(); - continue; } - req->setReferer(referer); - req->setMethod(method); - spentUris_.push_back(uri); - inFlightRequests_.push_back(req); - break; + } + uris_.insert(uris_.begin(), pending.begin(), pending.end()); + if(g == 0 && uriReuse && req.isNull() && uris_.size() == pending.size()) { + // Reuse URIs other than ones in pending + reuseUri(ignoreHost); } else { - req.reset(); + break; } } - uris_.insert(uris_.begin(), pending.begin(), pending.end()); - // TODO UriReuse is performed only when PREF_REUSE_URI is true. - if(g == 0 && uriReuse && req.isNull() && uris_.size() == pending.size()) { - // Reuse URIs other than ones in pending - reuseUri(ignoreHost); - } else { - break; - } - } - if(req.isNull()) { - Request r; - for(std::deque<SharedHandle<Request> >::iterator i = requestPool_.begin(), - eoi = requestPool_.end(); i != eoi; ++i) { - r.setUri((*i)->getUri()); - if(std::count(inFlightHosts.begin(), inFlightHosts.end(), r.getHost()) - >= static_cast<int>(maxConnectionPerServer_)) { - continue; - } - req = *i; - requestPool_.erase(i); - inFlightRequests_.push_back(req); - return req; + } else { + req = requestPool_.front(); + requestPool_.pop_front(); + inFlightRequests_.push_back(req); + if(logger_->debug()) { + logger_->debug("Picked up from pool: %s", req->getUri().c_str()); } } return req; |
