diff --git a/source/dub/dub.d b/source/dub/dub.d index 3e48d90..0c1b072 100644 --- a/source/dub/dub.d +++ b/source/dub/dub.d @@ -60,8 +60,14 @@ } /// The URL to the official package registry. -enum defaultRegistryURL = "http://code.dlang.org/"; -enum fallbackRegistryURL = "https://code-mirror.dlang.io/"; +enum defaultRegistryURL = "https://code.dlang.org/"; +enum fallbackRegistryURLs = [ + // fallback in case of HTTPS problems + "http://code.dlang.org/", + "https://code-mirror.dlang.io/", + "https://code-mirror2.dlang.io/", + "https://dub-registry.herokuapp.com/", +]; /** Returns a default list of package suppliers. @@ -76,7 +82,7 @@ return [ new FallbackPackageSupplier( new RegistryPackageSupplier(URL(defaultRegistryURL)), - new RegistryPackageSupplier(URL(fallbackRegistryURL)) + fallbackRegistryURLs.map!(x => cast(PackageSupplier) new RegistryPackageSupplier(URL(x))).array ) ]; } diff --git a/source/dub/packagesupplier.d b/source/dub/packagesupplier.d index 449cbd0..8336b92 100644 --- a/source/dub/packagesupplier.d +++ b/source/dub/packagesupplier.d @@ -292,17 +292,19 @@ package abstract class AbstractFallbackPackageSupplier : PackageSupplier { - protected PackageSupplier m_default, m_fallback; + protected PackageSupplier m_default; + protected PackageSupplier[] m_fallbacks; - this(PackageSupplier default_, PackageSupplier fallback) + this(PackageSupplier default_, PackageSupplier[] fallbacks) { m_default = default_; - m_fallback = fallback; + m_fallbacks = fallbacks; } override @property string description() { - return format("%s (fallback %s)", m_default.description, m_fallback.description); + import std.algorithm : map; + return format("%s (fallback %s)", m_default.description, m_fallbacks.map!(x => x.description)); } // Workaround https://issues.dlang.org/show_bug.cgi?id=2525 @@ -322,7 +324,19 @@ private template fallback(T, alias func) { enum fallback = q{ - scope (failure) return m_fallback.%1$s(args); + import std.range : back, dropBackOne; + import dub.internal.vibecompat.core.log : logDebug; + scope (failure) + { + foreach (m_fallback; m_fallbacks.dropBackOne) + { + try + return m_fallback.%1$s(args); + catch(Exception) + logDebug("Package supplier %s failed. Trying next fallback.", m_fallback); + } + return m_fallbacks.back.%1$s(args); + } return m_default.%1$s(args); }.format(__traits(identifier, func)); }