Catch HTTPExceptions in App::runFrontend()
Set correct http response header, display error message using "404.tpl"
This commit is contained in:
parent
b96dbcd4cb
commit
89eaf508f1
99
src/App.php
99
src/App.php
|
@ -9,6 +9,7 @@ use DOMDocument;
|
||||||
use DOMXPath;
|
use DOMXPath;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
|
use Friendica\Network\HTTPException;
|
||||||
use Friendica\Network\HTTPException\InternalServerErrorException;
|
use Friendica\Network\HTTPException\InternalServerErrorException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1718,62 +1719,72 @@ class App
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$content = '';
|
|
||||||
|
|
||||||
// Initialize module that can set the current theme in the init() method, either directly or via App->profile_uid
|
// Initialize module that can set the current theme in the init() method, either directly or via App->profile_uid
|
||||||
if ($this->module_loaded) {
|
try {
|
||||||
$this->page['page_title'] = $this->module;
|
$content = '';
|
||||||
$placeholder = '';
|
|
||||||
|
|
||||||
Core\Addon::callHooks($this->module . '_mod_init', $placeholder);
|
// Initialize module that can set the current theme in the init() method, either directly or via App->profile_uid
|
||||||
|
if ($this->module_loaded) {
|
||||||
|
$this->page['page_title'] = $this->module;
|
||||||
|
$placeholder = '';
|
||||||
|
|
||||||
call_user_func([$this->module_class, 'init']);
|
Core\Addon::callHooks($this->module . '_mod_init', $placeholder);
|
||||||
|
|
||||||
// "rawContent" is especially meant for technical endpoints.
|
call_user_func([$this->module_class, 'init']);
|
||||||
// This endpoint doesn't need any theme initialization or other comparable stuff.
|
|
||||||
if (!$this->error) {
|
|
||||||
call_user_func([$this->module_class, 'rawContent']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load current theme info after module has been initialized as theme could have been set in module
|
// "rawContent" is especially meant for technical endpoints.
|
||||||
$theme_info_file = 'view/theme/' . $this->getCurrentTheme() . '/theme.php';
|
// This endpoint doesn't need any theme initialization or other comparable stuff.
|
||||||
if (file_exists($theme_info_file)) {
|
if (!$this->error) {
|
||||||
require_once $theme_info_file;
|
call_user_func([$this->module_class, 'rawContent']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (function_exists(str_replace('-', '_', $this->getCurrentTheme()) . '_init')) {
|
|
||||||
$func = str_replace('-', '_', $this->getCurrentTheme()) . '_init';
|
|
||||||
$func($this);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->module_loaded) {
|
|
||||||
if (! $this->error && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
||||||
Core\Addon::callHooks($this->module . '_mod_post', $_POST);
|
|
||||||
call_user_func([$this->module_class, 'post']);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! $this->error) {
|
// Load current theme info after module has been initialized as theme could have been set in module
|
||||||
Core\Addon::callHooks($this->module . '_mod_afterpost', $placeholder);
|
$theme_info_file = 'view/theme/' . $this->getCurrentTheme() . '/theme.php';
|
||||||
call_user_func([$this->module_class, 'afterpost']);
|
if (file_exists($theme_info_file)) {
|
||||||
|
require_once $theme_info_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! $this->error) {
|
if (function_exists(str_replace('-', '_', $this->getCurrentTheme()) . '_init')) {
|
||||||
$arr = ['content' => $content];
|
$func = str_replace('-', '_', $this->getCurrentTheme()) . '_init';
|
||||||
Core\Addon::callHooks($this->module . '_mod_content', $arr);
|
$func($this);
|
||||||
$content = $arr['content'];
|
|
||||||
$arr = ['content' => call_user_func([$this->module_class, 'content'])];
|
|
||||||
Core\Addon::callHooks($this->module . '_mod_aftercontent', $arr);
|
|
||||||
$content .= $arr['content'];
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// initialise content region
|
if ($this->module_loaded) {
|
||||||
if ($this->getMode()->isNormal()) {
|
if (! $this->error && $_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
Core\Addon::callHooks('page_content_top', $this->page['content']);
|
Core\Addon::callHooks($this->module . '_mod_post', $_POST);
|
||||||
}
|
call_user_func([$this->module_class, 'post']);
|
||||||
|
}
|
||||||
|
|
||||||
$this->page['content'] .= $content;
|
if (! $this->error) {
|
||||||
|
Core\Addon::callHooks($this->module . '_mod_afterpost', $placeholder);
|
||||||
|
call_user_func([$this->module_class, 'afterpost']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $this->error) {
|
||||||
|
$arr = ['content' => $content];
|
||||||
|
Core\Addon::callHooks($this->module . '_mod_content', $arr);
|
||||||
|
$content = $arr['content'];
|
||||||
|
$arr = ['content' => call_user_func([$this->module_class, 'content'])];
|
||||||
|
Core\Addon::callHooks($this->module . '_mod_aftercontent', $arr);
|
||||||
|
$content .= $arr['content'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialise content region
|
||||||
|
if ($this->getMode()->isNormal()) {
|
||||||
|
Core\Addon::callHooks('page_content_top', $this->page['content']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->page['content'] .= $content;
|
||||||
|
} catch (HTTPException $e) {
|
||||||
|
header($_SERVER["SERVER_PROTOCOL"] . " " . $e->httpcode . " " . $e->httpdesc , true, $e->httpcode);
|
||||||
|
$error = ($e->getMessage() !== "" ? $e->getMessage() : $e->httpdesc);
|
||||||
|
$tpl = Core\Renderer::getMarkupTemplate("404.tpl");
|
||||||
|
$this->page['content'] = Core\Renderer::replaceMacros($tpl, [
|
||||||
|
'$message' => $error
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/* Create the page head after setting the language
|
/* Create the page head after setting the language
|
||||||
* and getting any auth credentials.
|
* and getting any auth credentials.
|
||||||
|
|
Loading…
Reference in a new issue