array_shift($trace);
$callstack = [];
- $previous = ['class' => '', 'function' => ''];
+ $previous = ['class' => '', 'function' => '', 'database' => false];
// The ignore list contains all functions that are only wrapper functions
- $ignore = ['fetchUrl', 'call_user_func_array'];
+ $ignore = ['call_user_func_array'];
while ($func = array_pop($trace)) {
if (!empty($func['class'])) {
- // Don't show multiple calls from the "dba" class to show the essential parts of the callstack
- if ((($previous['class'] != $func['class']) || ($func['class'] != 'Friendica\Database\DBA')) && ($previous['function'] != 'q')) {
+ // Don't show multiple calls from the Database classes to show the essential parts of the callstack
+ $func['database'] = in_array($func['class'], ['Friendica\Database\DBA', 'Friendica\Database\Database']);
+ if (!$previous['database'] || !$func['database']) {
$classparts = explode("\\", $func['class']);
$callstack[] = array_pop($classparts).'::'.$func['function'];
$previous = $func;
}
} elseif (!in_array($func['function'], $ignore)) {
+ $func['database'] = ($func['function'] == 'q');
$callstack[] = $func['function'];
$func['class'] = '';
$previous = $func;
* and adds an application/json HTTP header to the output.
* After finishing the process is getting killed.
*
- * @param mixed $x The input content.
- * @param string $content_type Type of the input (Default: 'application/json').
+ * @param mixed $x The input content.
+ * @param string $content_type Type of the input (Default: 'application/json').
+ * @param integer $options JSON options
*/
- public static function jsonExit($x, $content_type = 'application/json') {
+ public static function jsonExit($x, $content_type = 'application/json', int $options = 0) {
header("Content-type: $content_type");
- echo json_encode($x);
+ echo json_encode($x, $options);
exit();
}
*/
public static function htmlUpdateExit($o)
{
- if (DI::pConfig()->get(local_user(), "system", "bandwidth_saver")) {
- $replace = "<br />".DI::l10n()->t("[Embedded content - reload page to view]")."<br />";
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $o = preg_replace($pattern, $replace, $o);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $o = preg_replace($pattern, $replace, $o);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $o = preg_replace($pattern, $replace, $o);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $o = preg_replace($pattern, $replace, $o);
- }
-
header("Content-type: text/html");
echo "<!DOCTYPE html><html><body>\r\n";
// We can remove this hack once Internet Explorer recognises HTML5 natively