aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Downloads.php147
1 files changed, 103 insertions, 44 deletions
diff --git a/lib/Downloads.php b/lib/Downloads.php
index a20070c1d..12535c58b 100644
--- a/lib/Downloads.php
+++ b/lib/Downloads.php
@@ -285,7 +285,7 @@ class Downloads
*
* @return array
*/
- function get_mirror($country, $continent = null, $prod = true, $documentation = false, $mirrorlist = false)
+ function get_mirror($country, $continent = null, $prod = true, $documentation = false, $mirrorlist = false, $https_only = false)
{
$mirs = self::get_all_mirrors($prod, $documentation, $mirrorlist);
$continent = '_C:' . $continent;
@@ -299,75 +299,134 @@ class Downloads
);
$hostnames = array();
$list_of_mirrs['country_alternate_protocol'] = array();
+ $continent_https_only = array();
+ $other_continents_https_only = array();
foreach ($mirs as $curr_continent => $continent_mirrors) {
- if ($continent != $curr_continent)
- {
- if ($mirrorlist)
+ foreach ($continent_mirrors as $mirror) {
+ if ($continent != $curr_continent)
{
- foreach ($continent_mirrors as $mirror) {
+ if ($mirrorlist)
+ {
$list_of_mirrs['other_continents'][] = $mirror['url'];
}
+ elseif (true === $https_only)
+ {
+ $pu = parse_url($mirror['url']);
+ if ('https' == $pu['scheme'])
+ {
+ $other_continents_https_only[$curr_continent][] = $mirror;
+ }
+ }
}
- continue;
- }
- foreach ($continent_mirrors as $mirror) {
- if (strpos($mirror['url'], 'distrib-coffee.ipsl.jussieu.fr') !== false)
- {
- // exclude source server to drop it's DL load
- continue;
- }
- // keep assisting the french mirrors with german ones
- if ($mirror['country'] == 'DE')
- {
- $fr_mirr_asist[] = $mirror;
- }
- // only add german mirrors when french are on turn
- // sorting of mirror db cache must be kept to work properly (DE before FR)
- if ($country == 'FR' && $mirror['country'] == 'FR' && count($fr_mirr_asist) > 0)
- {
- $mirrors[$continent] = $fr_mirr_asist;
- $fr_mirr_asist = array();
- }
- if ($mirrorlist)
+ else
{
- $pu = parse_url($mirror['url']);
- if (in_array($pu['host'], $hostnames)) {
- $list_of_mirrs['country_alternate_protocol'][] = $mirror['url'];
+ if (strpos($mirror['url'], 'distrib-coffee.ipsl.jussieu.fr') !== false)
+ {
+ // exclude source server to drop it's DL load
+ continue;
+ }
+ // keep assisting the french mirrors with german ones
+ if ($country == 'FR' && $mirror['country'] == 'DE')
+ {
+ $pu = parse_url($mirror['url']);
+ if ('https' == $pu['scheme']) {
+ $fr_mirr_asist[] = $mirror;
+ }
+ }
+ // only add german mirrors when french are on turn
+ // sorting of mirror db cache must be kept to work properly (DE before FR)
+ if ($country == 'FR' && $mirror['country'] == 'FR' && count($fr_mirr_asist) > 0)
+ {
+ $mirrors[$continent] = $fr_mirr_asist;
+ $fr_mirr_asist = array();
+ }
+ if ($mirrorlist)
+ {
+ $pu = parse_url($mirror['url']);
+ if (in_array($pu['host'], $hostnames))
+ {
+ $list_of_mirrs['country_alternate_protocol'][] = $mirror['url'];
+ }
+ else
+ {
+ $hostnames[] = $pu['host'];
+ if ($mirror['country'] == $country)
+ {
+ $list_of_mirrs['country'][] = $mirror['url'];
+ }
+ else
+ {
+ $list_of_mirrs['continent_minus_country'][] = $mirror['url'];
+ }
+ }
}
else
{
- $hostnames[] = $pu['host'];
if ($mirror['country'] == $country)
{
- $list_of_mirrs['country'][] = $mirror['url'];
+ if (true === $https_only)
+ {
+ $pu = parse_url($mirror['url']);
+ if ('https' == $pu['scheme']) {
+ $mirrors[$continent][] = $mirror;
+ }
+ }
+ else
+ {
+ $mirrors[$continent][] = $mirror;
+ }
}
else
{
- $list_of_mirrs['continent_minus_country'][] = $mirror['url'];
+ if (true === $https_only)
+ {
+ $pu = parse_url($mirror['url']);
+ if ('https' == $pu['scheme']) {
+ $continent_https_only[$curr_continent][] = $mirror;
+ }
+ }
}
}
}
- else
+ }
+ }
+ if (count($mirrors) == 0)
+ {
+ if (true === $https_only)
+ {
+ if (count($continent_https_only) > 0)
{
- if ($mirror['country'] == $country)
- {
- $mirrors[$continent][] = $mirror;
- }
+ $mirrors = $continent_https_only;
+ }
+ if (count($mirrors) == 0 && count($other_continents_https_only) > 0)
+ {
+ $mirrors = $other_continents_https_only;
}
}
- if (count($mirrors) == 0)
+ else
{
// add all continent mirrors if country doesn't have any
$mirrors[$continent] = $continent_mirrors;
}
}
+ // falback if selection fails
if (count($mirrors) > 0)
{
$mirs = $mirrors;
}
- shuffle($mirs);
- $mirr_continent = $mirs[0];
+ // a workaround as shuffle() doesn't preserve assoc. keys
+ if (count($mirs) > 1)
+ {
+ $mirs_keys = array_keys($mirs);
+ shuffle($mirs_keys);
+ foreach($mirs_keys as $key) {
+ $shuffled[$key] = $mirs[$key];
+ }
+ $mirs = $shuffled;
+ }
+
+ $mirr_continent = array_keys($mirs)[0];
$mirs = array_shift($mirs);
shuffle($mirs);
$one_mirror = array_shift($mirs);
@@ -390,9 +449,9 @@ class Downloads
return $one_mirror;
}
- function prepare_download($force = false, $country = null, $prod = true, $documentation = false, $mirrorlist = false)
+ function prepare_download($force = false, $country = null, $prod = true, $documentation = false, $mirrorlist = false, $https_only = false)
{
- return $this->get_one_mirror($force, $country, $prod, $documentation, $mirrorlist);
+ return $this->get_one_mirror($force, $country, $prod, $documentation, $mirrorlist, $https_only);
}
/**
@@ -408,7 +467,7 @@ class Downloads
*
* TODO extract as much as possible $_SESSION(read) and $_SERVER and $_GET
*/
- function get_one_mirror($force = false, $country = null, $prod = true, $documentation = false, $mirrorlist = false)
+ function get_one_mirror($force = false, $country = null, $prod = true, $documentation = false, $mirrorlist = false, $https_only = false)
{
$fuzzy_mirror = false;
@@ -470,7 +529,7 @@ class Downloads
$continent = null;
}
- $mirror = $this->get_mirror($country, $continent, $prod, $documentation, $mirrorlist);
+ $mirror = $this->get_mirror($country, $continent, $prod, $documentation, $mirrorlist, $https_only);
$mirror['purl'] = parse_url($mirror['url']);
// reassign country, as get_one_mirror() may have decided