for(I=list.begin(); I != list.end(); I++)
{
string uri = (*I)->GetURI();
- if(uri.substr(0,strlen("mirror://")) != string("mirror://"))
+ if(uri.find("mirror://") != 0)
continue;
string BaseUri = uri.substr(0,uri.size()-1);
if (URItoFileName(BaseUri) == Dir->d_name)
return;
// find current mirror and select next one
- for (int i=0; i < AllMirrors.size(); i++)
+ for (vector<string>::const_iterator mirror = AllMirrors.begin();
+ mirror != AllMirrors.end(); ++mirror)
{
- if (Queue->Uri.find(AllMirrors[i]) == 0)
+ if (Queue->Uri.find(*mirror) == 0)
{
- Queue->Uri.replace(0, AllMirrors[i].size(), BaseUri);
+ Queue->Uri.replace(0, mirror->length(), BaseUri);
return;
}
}
_error->Error("Internal error: Failed to convert %s back to %s",
- Queue->Uri, BaseUri);
+ Queue->Uri.c_str(), BaseUri.c_str());
}
bool MirrorMethod::TryNextMirror()
{
- if(Debug)
- cerr << "using mirror: " << Mirror << endl;
-
// find current mirror and select next one
- for (int i=0; i < AllMirrors.size()-1; i++)
+ for (vector<string>::const_iterator mirror = AllMirrors.begin();
+ mirror != AllMirrors.end(); ++mirror)
{
- if (Queue->Uri.find(AllMirrors[i]) == 0)
- {
- Queue->Uri.replace(0, AllMirrors[i].size(), AllMirrors[i+1]);
- return true;
- }
+ if (Queue->Uri.find(*mirror) != 0)
+ continue;
+
+ vector<string>::const_iterator nextmirror = mirror + 1;
+ if (nextmirror != AllMirrors.end())
+ break;
+ Queue->Uri.replace(0, mirror->length(), *nextmirror);
+ if (Debug)
+ clog << "TryNextMirror: " << Queue->Uri << endl;
+ return true;
}
+ if (Debug)
+ clog << "TryNextMirror could not find another mirror to try" << endl;
+
return false;
}
DownloadMirrorFile(Itm->Uri);
}
- if(Mirror.empty()) {
+ if(AllMirrors.empty()) {
if(!InitMirrors()) {
// no valid mirror selected, something went wrong downloading
// from the master mirror site most likely and there is
return false;
}
}
- if(Debug)
- clog << "selected mirror: " << Mirror << endl;
+ if(Itm->Uri.find("mirror://") != string::npos)
+ Itm->Uri.replace(0,BaseUri.size(), Mirror);
- for (FetchItem *I = Queue; I != 0; I = I->Next)
- {
- if(I->Uri.find("mirror://") != string::npos)
- I->Uri.replace(0,BaseUri.size(), Mirror);
- }
+ if(Debug)
+ clog << "Fetch: " << Itm->Uri << endl << endl;
// now run the real fetcher
return HttpMethod::Fetch(Itm);
void MirrorMethod::Fail(string Err,bool Transient)
{
- // try the next mirror on fail
- if (TryNextMirror())
+ // FIXME: TryNextMirror is not ideal for indexfile as we may
+ // run into auth issues
+
+ if (Debug)
+ clog << "Failure to get " << Queue->Uri << endl;
+
+ // try the next mirror on fail (if its not a expected failure,
+ // e.g. translations are ok to ignore)
+ if (!Queue->FailIgnore && TryNextMirror())
return;
// all mirrors failed, so bail out