summaryrefslogtreecommitdiff
path: root/src/FileEntry.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-31 11:17:38 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-31 11:17:38 +0000
commit5cb09dabf5994c861b0bc794f0885f9b6758c216 (patch)
treea06930a05088378e435d43f501bd8f95fb0bcce8 /src/FileEntry.cc
parent3434be81101347dfbed4c50d46be6360f1ca074b (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.cc107
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;