$mirror) {
if (mirror_status($murl) != MIRROR_OK) { continue; }
if ($country === FALSE || mirror_country($murl) == $country) { $count++; }
}
return $count;
}
// Redirect to an URI on this mirror site or outside this site
function mirror_redirect($absoluteURI)
{
global $MYSITE;
// Test if there is no protocol spec
// in the URL, then prepend local site URI
if (!preg_match("!^[a-z]+://!", $absoluteURI)) {
$absoluteURI = substr($MYSITE, 0, -1) . $absoluteURI;
}
// Do a redirection, if headers are not sent
if (!headers_sent()) {
header("Location: $absoluteURI");
}
// Always exit (the page is not to be displayed)
exit;
}
// Set a cookie for all the .php.net sites for the root
// dir with $name and $content. Provide $exptime relatively
// to the current time!
function mirror_setcookie($name, $content, $exptime)
{
if (!headers_sent()) {
if (is_official_mirror()) {
return setcookie($name, $content, time() + $exptime, '/', '.php.net');
} else {
return setcookie($name, $content, time() + $exptime, '/');
}
} else {
return FALSE;
}
}
function organise_mirrors($mirrors) {
// Lets group the mirrors by country code, for easy output on the page.
$retval = array();
foreach($mirrors as $key => $mirror) {
// If the mirror is not all right or it is virtual (not an official mirror), skip it
if (mirror_status($key) != MIRROR_OK || mirror_type($key) == MIRROR_VIRTUAL) { continue; }
if(!isset($grouped_mirrors[$mirror[0]])) {
$grouped_mirrors[$mirror[0]] = array();
}
$retval[$mirror[0]][] = array(
'url' => $key,
'country_code' => $mirror[0],
'provider_title' => $mirror[1],
'provider_url' => $mirror[3]
);
}
return $retval;
}
function print_full_mirror_list($download_file = null, $direct_download = false) {
global $COUNTRIES, $COUNTRY, $MIRRORS;
$groupped = organise_mirrors($MIRRORS);
$close = count_mirrors($COUNTRY);
if ($close) {
$mnum = (($close > 1) ? "mirrors" : "mirror");
echo "
We have automatically detected the following $mnum to be close to you
";
if (isset($groupped[$COUNTRY])) {
print_mirror_box($COUNTRIES[$COUNTRY], $COUNTRY, $groupped[$COUNTRY], $download_file, $direct_download, true);
echo "
";
}
}
foreach($groupped as $mirrorcode => $country) {
print_mirror_box($COUNTRIES[$mirrorcode], $mirrorcode, $country, $download_file, $direct_download, false);
}
}
function print_mirror_box($countryname, $countrycode, $mirrors, $file = null, $direct_download = false, $homecountry = false) {
?>
'Unable to find a way to retrieve data with curl',
'ERROR_LAST' => $php_errormsg,
);
}
return $data;
}
if(function_exists('file_get_contents') && ini_get('allow_url_fopen')) {
$context = null;
$opts = array('user_agent' => 'php.net');
if (version_compare(PHP_VERSION, '5.1.0', '>')) {
$context = stream_context_get_default(array('http' => $opts));
}
elseif (version_compare(PHP_VERSION, '5.0.0', '>')) {
$context = stream_context_create(array('http' => $opts));
}
if ($context) {
$data = @file_get_contents($url, false, $context);
} else {
$data = @file_get_contents($url, false);
}
if ($headers) {
return $http_response_header;
}
if (!$data) {
return array(
'ERROR_NOTE' => 'Unable to find a way to retrieve data with file_get_contents',
'ERROR_LAST' => $php_errormsg,
'URL' => $url,
);
}
return $data;
}
$array = parse_url($url);
if(function_exists('fsockopen') && $fd = @fsockopen($array["host"], 80, $errno, $errstr, 15)) {
$data = "";
$header = array();
$body = false;
$path = $array["path"];
if (isset($array["query"])) {
$path .= "?" . $array["query"];
}
fputs($fd,"GET {$path} HTTP/1.0\r\n");
fputs($fd,"Host: {$array["host"]}\r\n");
fputs($fd,"User-Agent: php.net\r\n");
fputs($fd,"Connection: close\r\n\r\n");
while($line = fgets($fd)) {
if($body) {
$data .= $line;
} elseif(strlen($line)<=2) {
$body = true;
} else {
$header[] = $line;
}
}
fclose($fd);
if ($headers) {
return $header;
}
if (!$data) {
return array(
'ERROR_NOTE' => 'Unable to find a way to retrieve data with fsockopen',
'ERROR_LAST' => $php_errormsg,
);
}
return $data;
}
// TODO: Log if we get here
// Redirect to www.php.net ?
return array(
'ERROR_NOTE' => 'Unable to find a way to retrieve data',
'ERROR_LAST' => $php_errormsg,
);
}
// Compatibility function to fetch headers from external source
function fetch_header($url, $header) {
$headers = array();
if(function_exists("get_headers") && ini_get('allow_url_fopen')) {
$headers = get_headers($url, 1);
} else {
$data = fetch_contents($url, true);
if (isset($data["ERROR_NOTE"])) {
return null;
}
foreach($data as $line) {
if (($pos = strpos($line, ":")) !== false) {
$headers[substr($line, 0, $pos)] = trim(substr($line, $pos+1));
} else {
$headers[0] = trim($line);
}
}
}
if (!is_array($headers) || empty($headers)) {
return null;
}
if (is_string($header)) {
$header = strtolower($header);
$headers = array_change_key_case($headers, CASE_LOWER);
}
return isset($headers[$header]) ? $headers[$header] : null;
}
function get_available_sqlites() {
$allsqlites = array(1 => 'sqlite', 2 => 'sqlite3', 4 => 'pdo_sqlite', 8 => 'pdo_sqlite2');
$avail = 0;
if (function_exists('sqlite_open')) {
$avail += 1;
}
if (class_exists('sqlite3')) {
$avail += 2;
}
if (method_exists('PDO', 'getavailabledrivers')) {
foreach (PDO::getavailabledrivers() as $driver) {
switch ($driver) {
case 'sqlite':
$avail += 4;
break;
case 'sqlite2':
$avail += 8;
break;
}
}
}
return $avail;
}
// Get all manual prefix search sections
function get_manual_search_sections() {
return array(
"", "book.", "ref.", "function.", "class.",
"features.", "control-structures.", "language.",
"about.", "faq.",
);
}
function get_shortname($page) {
// We can at the very least kill the .php
$shorturl = substr($page, 0, -4);
// If its a "root page", we can't shorten it more
if (strpos($shorturl, "/") === false) {
return $shorturl;
}
// Manual pages get be quite short
if (strpos($page, "manual/") !== false) {
$sections = get_manual_search_sections();
// Kill the first entry (empty)
array_shift($sections);
// We can atleast remove manual/xx/
$shorturl = substr($page, strrpos($page, "/")+1);
foreach($sections as $section) {
// If we know this section
if (strpos($shorturl, $section) === 0) {
// We can make it even shorter
return substr($shorturl, strlen($section), -4);
break;
}
}
// Didn't recognize the section, we better not shorten it at all
return $page;
}
// /conferences/index.php can be shortened to /conferences
if (strpos($page, "conferences/") !== false) {
return "conferences";
}
return $shorturl;
}
// Guess the current site from what Apache tells us.
// This should be the main name of the mirror (in case
// it works under more then one name). SERVER_NAME is
// the name of the Apache vhost.
if (!isset($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] != "on") {
$proto = "http";
} else {
$proto = "https";
}
if($_SERVER["SERVER_PORT"] != '80' && $_SERVER["SERVER_PORT"] != 443) {
$MYSITE = $proto . '://' . $_SERVER["SERVER_NAME"] . ':' . (int)$_SERVER["SERVER_PORT"] . '/';
$msite = 'http://' . $_SERVER["SERVER_NAME"] . ':' . (int)$_SERVER["SERVER_PORT"] . '/';
} else {
$MYSITE = $proto . '://' . $_SERVER["SERVER_NAME"] . '/';
$msite = 'http://' . $_SERVER["SERVER_NAME"] . '/';
}
// If this site does not exist - it is most likely because
// CC.php.net isn't in this array anymore.
if (!isset($MIRRORS[$MYSITE])) {
if (isset($MIRRORS[$msite])) {
$MIRRORS[$MYSITE] = $MIRRORS[$msite];
unset($MIRRORS[$msite]);
}
}
if (!isset($MIRRORS[$MYSITE])) {
// Check if the IP address exists (a fix for the round-robin introduction)
if (isset($MIRRORS[$_SERVER['SERVER_ADDR']])) {
// Since it does, we know the servername is fine
$MYSITE = $proto . '://' . $_SERVER["SERVER_NAME"] . '/';
} else {
// Try the hostname [without www]. In case the main name above is
// not found, we try to find the mirror with the name provided by
// the browser (in the Host HTTP header).
$msite = str_replace("www.", "", $msite);
// If the name without www. exists, use it
if (isset($MIRRORS[$msite])) {
$MYSITE = str_replace("www.", "", $MYSITE);
if (!isset($MIRRORS[$MYSITE])) {
$MIRRORS[$MYSITE] = $MIRRORS[$msite];
unset($MIRRORS[$msite]);
}
}
}
}
// If the mirror is not registered with this name, provide defaults
// (no country code, no search, no stats, English default language ...)
if (!isset($MIRRORS[$MYSITE])) {
$MIRRORS[$MYSITE] = array("xx", $MYSITE, FALSE, $MYSITE, MIRROR_VIRTUAL, FALSE, "en", MIRROR_OK);
}
// Override mirror language with local preference
if (isset($_SERVER['MIRROR_LANGUAGE'])) {
if (isset($LANGUAGES[$_SERVER['MIRROR_LANGUAGE']])) {
$MIRRORS[$MYSITE][6] = $_SERVER['MIRROR_LANGUAGE'];
}
}
// Fallback to English in case the language
// set is definitely not supported
if (!isset($LANGUAGES[$MIRRORS[$MYSITE][6]])) {
$MIRRORS[$MYSITE][6] = "en";
}
// Override central stats information if specified in vhost
if (isset($_SERVER['MIRROR_STATS'])) {
$MIRRORS[$MYSITE][2] = TRUE;
}
// Provide base href information to make relative links on
// shortcut URL accessed pages work without redirection
if (isset($_SERVER['BASE_PAGE'])) {
$_SERVER['BASE_HREF'] = $MYSITE . $_SERVER['BASE_PAGE'];
} else { unset($_SERVER['BASE_HREF']); }