aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--en/downloads/get/index.php2
-rw-r--r--en/downloads/get/lib.php4
-rw-r--r--lib/Downloads.php147
3 files changed, 106 insertions, 47 deletions
diff --git a/en/downloads/get/index.php b/en/downloads/get/index.php
index add253c0f..21e0fb782 100644
--- a/en/downloads/get/index.php
+++ b/en/downloads/get/index.php
@@ -83,7 +83,7 @@ try {
$product['file'] = $release . '-' . $type . '-' . $lang . '.' . $extension;
$product['name'] = $product['file'];
}
- $all_mirrors = get_mirrors_for($product['file'], 'en', get('country'), true, $documentation);
+ $all_mirrors = get_mirrors_for($product['file'], 'en', get('country'), true, $documentation, true);
$one_mirror = $all_mirrors[0];
$alt_mirrors = $all_mirrors[1];
$download_tmpl = get_download_link($product, $torrent);
diff --git a/en/downloads/get/lib.php b/en/downloads/get/lib.php
index 79374d2af..40a2cb238 100644
--- a/en/downloads/get/lib.php
+++ b/en/downloads/get/lib.php
@@ -172,13 +172,13 @@ function get_info_for_product($product, $def_file = null)
* speed
* link
*/
-function get_mirrors_for($file, $locale = null, $country = null, $prod = true, $documentation = false)
+function get_mirrors_for($file, $locale = null, $country = null, $prod = true, $documentation = false, $https_only = false)
{
//include '../../../lib/Downloads.php';
$mirrors = Downloads::get_all_mirrors($prod, $documentation);
$wsd = new Downloads();
- $one = $wsd->prepare_download(true, $country, $prod, $documentation);
+ $one = $wsd->prepare_download(true, $country, $prod, $documentation, false, $https_only);
return array($one, $mirrors);
}
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