public static function parseCfgUri($uri, $source = null)
{
if (mb_orig_strpos($uri, '://') === false) {
if (strncmp($uri, 'unix:', 5) === 0) {
$e = explode(':', $uri);
if (sizeof($e) === 4) {
$uri = 'unix://' . $e[1] . ':' . $e[2] . '@localhost' . $e[3];
} elseif (sizeof($e) === 3) {
$uri = 'unix://' . $e[1] . '@localhost' . $e[2];
} else {
$uri = 'unix://localhost' . $e[1];
}
} else {
$uri = 'tcp://' . $uri;
}
}
if (stripos($uri, 'unix:///') === 0) {
$uri = 'unix://localhost/' . substr($uri, 8);
}
$zeroPortNum = false;
$uri = preg_replace_callback('~:0(?:$|/)~', function () use(&$zeroPortNum) {
$zeroPortNum = true;
return '';
}, $uri);
$u = parse_url($uri);
$u['host'] = trim($u['host'], '][');
$u['uri'] = $uri;
if ($zeroPortNum) {
$u['port'] = 0;
}
if (!isset($u['scheme'])) {
$u['scheme'] = '';
}
$u['params'] = [];
if (!isset($u['fragment'])) {
return $u;
}
$hash = '#' . $u['fragment'];
$error = false;
preg_replace_callback('~(#+)(.+?)(?=#|$)|(.+)~', function ($m) use(&$u, &$error, $uri) {
if ($error) {
return;
}
list(, $type, $value) = $m;
if ($type === '#') {
// standard value
$e = explode('=', $value, 2);
if (sizeof($e) === 2) {
list($key, $value) = $e;
} else {
$key = $value;
$value = true;
}
$u['params'][$key] = $value;
} elseif ($type === '##') {
// Context name
$u['params']['ctxname'] = $value;
} else {
Daemon::log('Malformed URI: ' . var_export($uri, true) . ', unexpected token \'' . $type . '\'');
$error = true;
}
}, $hash);
return $error ? false : $u;
}