X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FSystem.php;h=e84fcb5737733f649f13bf3ed4c2a3e34c51e4fe;hb=0d1fa70e2ecb372d158871285e0cda5f6d77194a;hp=45a88fe0937b6d92c349d527c8985eab28e04c05;hpb=4aa28de89ec9dd0e27b37dbde9b8758c5bb6c4b4;p=friendica.git diff --git a/src/Core/System.php b/src/Core/System.php index 45a88fe093..e84fcb5737 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -1,78 +1,67 @@ . + * */ + namespace Friendica\Core; -use Friendica\BaseObject; +use Friendica\DI; use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Util\XML; /** - * @file include/Core/System.php - * - * @brief Contains the class with system relevant stuff - */ - - -/** - * @brief System methods + * Contains the class with system relevant stuff */ -class System extends BaseObject +class System { /** - * @brief Retrieves the Friendica instance base URL + * Returns a string with a callstack. Can be used for logging. * - * @param bool $ssl Whether to append http or https under SSL_POLICY_SELFSIGN - * @return string Friendica server base URL - * @throws InternalServerErrorException - */ - public static function baseUrl($ssl = false) - { - return self::getApp()->getBaseURL($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 - * @throws \Exception - */ - public static function removedBaseUrl($orig_url) - { - return self::getApp()->removeBaseURL($orig_url); - } - - /** - * @brief Returns a string with a callstack. Can be used for logging. - * @param integer $depth optional, default 4 + * @param integer $depth How many calls to include in the stacks after filtering + * @param int $offset How many calls to shave off the top of the stack, for example if + * this is called from a centralized method that isn't relevant to the callstack * @return string */ - public static function callstack($depth = 4) + public static function callstack(int $depth = 4, int $offset = 0) { $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); + // We remove at least the first two items from the list since they contain data that we don't need. + $trace = array_slice($trace, 2 + $offset); $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; @@ -118,60 +107,19 @@ class System extends BaseObject } /** - * @brief Send HTTP status header and exit. + * Send HTTP status header and exit. * - * @param integer $val HTTP status result value - * @param array $description optional message - * 'title' => header title - * 'description' => optional message - * @throws InternalServerErrorException + * @param integer $val HTTP status result value + * @param string $message Error message. Optional. + * @param string $content Response body. Optional. + * @throws \Exception */ - public static function httpExit($val, $description = []) + public static function httpExit($val, $message = '', $content = '') { - $err = ''; - if ($val >= 400) { - if (!empty($description['title'])) { - $err = $description['title']; - } else { - $title = [ - '400' => L10n::t('Error 400 - Bad Request'), - '401' => L10n::t('Error 401 - Unauthorized'), - '403' => L10n::t('Error 403 - Forbidden'), - '404' => L10n::t('Error 404 - Not Found'), - '500' => L10n::t('Error 500 - Internal Server Error'), - '503' => L10n::t('Error 503 - Service Unavailable'), - ]; - $err = defaults($title, $val, 'Error ' . $val); - $description['title'] = $err; - } - if (empty($description['description'])) { - // Explanations are taken from https://en.wikipedia.org/wiki/List_of_HTTP_status_codes - $explanation = [ - '400' => L10n::t('The server cannot or will not process the request due to an apparent client error.'), - '401' => L10n::t('Authentication is required and has failed or has not yet been provided.'), - '403' => L10n::t('The request was valid, but the server is refusing action. The user might not have the necessary permissions for a resource, or may need an account.'), - '404' => L10n::t('The requested resource could not be found but may be available in the future.'), - '500' => L10n::t('An unexpected condition was encountered and no more specific message is suitable.'), - '503' => L10n::t('The server is currently unavailable (because it is overloaded or down for maintenance). Please try again later.'), - ]; - if (!empty($explanation[$val])) { - $description['description'] = $explanation[$val]; - } - } - } - - if ($val >= 200 && $val < 300) { - $err = 'OK'; - } - Logger::log('http_status_exit ' . $val); - header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err); + header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $message); - if (isset($description["title"])) { - $tpl = Renderer::getMarkupTemplate('http_status.tpl'); - echo Renderer::replaceMacros($tpl, ['$title' => $description["title"], - '$description' => defaults($description, 'description', '')]); - } + echo $content; exit(); } @@ -183,18 +131,19 @@ class System extends BaseObject } /** - * @brief Encodes content to json. + * Encodes content to json. * * This function encodes an array to json format * and adds an application/json HTTP header to the output. * After finishing the process is getting killed. * - * @param array $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(); } @@ -224,7 +173,7 @@ class System extends BaseObject if (is_bool($prefix) && !$prefix) { $prefix = ''; } elseif (empty($prefix)) { - $prefix = hash('crc32', self::getApp()->getHostName()); + $prefix = hash('crc32', DI::baseUrl()->getHostname()); } while (strlen($prefix) < ($size - 13)) { @@ -264,21 +213,36 @@ class System extends BaseObject * Redirects to an external URL (fully qualified URL) * If you want to route relative to the current Friendica base, use App->internalRedirect() * - * @param string $url The new Location to redirect + * @param string $url The new Location to redirect + * @param int $code The redirection code, which is used (Default is 302) + * * @throws InternalServerErrorException If the URL is not fully qualified */ - public static function externalRedirect($url) + public static function externalRedirect($url, $code = 302) { if (empty(parse_url($url, PHP_URL_SCHEME))) { throw new InternalServerErrorException("'$url' is not a fully qualified URL, please use App->internalRedirect() instead"); } + switch ($code) { + case 302: + // this is the default code for a REDIRECT + // We don't need a extra header here + break; + case 301: + header('HTTP/1.1 301 Moved Permanently'); + break; + case 307: + header('HTTP/1.1 307 Temporary Redirect'); + break; + } + header("Location: $url"); exit(); } /** - * @brief Returns the system user that is executing the script + * Returns the system user that is executing the script * * This mostly returns something like "www-data". * @@ -295,7 +259,7 @@ class System extends BaseObject } /** - * @brief Checks if a given directory is usable for the system + * Checks if a given directory is usable for the system * * @param $directory * @param bool $check_writable @@ -332,16 +296,32 @@ class System extends BaseObject return true; } + /** + * Exit method used by asynchronous update modules + * + * @param string $o + */ + public static function htmlUpdateExit($o) + { + header("Content-type: text/html"); + echo "
\r\n"; + // We can remove this hack once Internet Explorer recognises HTML5 natively + echo "