get_baseurl($ssl); } /** * @brief Removes the baseurl from an url. This avoids some mixed content problems. * * @param string $orig_url The url to be cleaned * * @return string The cleaned url */ public static function removedBaseUrl($orig_url) { return self::getApp()->remove_baseurl($orig_url); } /** * @brief Returns a string with a callstack. Can be used for logging. * @param integer $depth optional, default 4 * @return string */ public static function callstack($depth = 4) { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); // We remove the first two items from the list since they contain data that we don't need. array_shift($trace); array_shift($trace); $callstack = []; $counter = 0; $previous = ['class' => '', 'function' => '']; // The ignore list contains all functions that are only wrapper functions $ignore = ['get_config', 'get_pconfig', 'set_config', 'set_pconfig', 'fetch_url', 'probe_url']; while ($func = array_pop($trace)) { if (!empty($func['class'])) { // Don't show multiple calls from the same function (mostly used for "dba" class) if (($previous['class'] != $func['class']) && ($previous['function'] != 'q')) { $classparts = explode("\\", $func['class']); $callstack[] = array_pop($classparts).'::'.$func['function']; $previous = $func; } } elseif (!in_array($func['function'], $ignore)) { $callstack[] = $func['function']; $previous = $func; } } $callstack2 = []; while ((count($callstack2) < $depth) && (count($callstack) > 0)) { $callstack2[] = array_pop($callstack); } return implode(', ', $callstack2); } /** * @brief Called from db initialisation when db is dead. */ static public function unavailable() { echo <<< EOT