/var/www/vhosts/ihelp.ro/_OLD/vendor/cakephp/cakephp/src/Error
Edit: /var/www/vhosts/ihelp.ro/_OLD/vendor/cakephp/cakephp/src/Error/ExceptionRenderer.php (14158B)
error = $exception;
$this->request = $request;
$this->controller = $this->_getController();
}
/**
* Get the controller instance to handle the exception.
* Override this method in subclasses to customize the controller used.
* This method returns the built in `ErrorController` normally, or if an error is repeated
* a bare controller will be used.
*
* @return \Cake\Controller\Controller
* @triggers Controller.startup $controller
*/
protected function _getController(): Controller
{
$request = $this->request;
$routerRequest = Router::getRequest();
// Fallback to the request in the router or make a new one from
// $_SERVER
if ($request === null) {
$request = $routerRequest ?: ServerRequestFactory::fromGlobals();
}
// If the current request doesn't have routing data, but we
// found a request in the router context copy the params over
if ($request->getParam('controller') === null && $routerRequest !== null) {
$request = $request->withAttribute('params', $routerRequest->getAttribute('params'));
}
$errorOccured = false;
try {
$params = $request->getAttribute('params');
$params['controller'] = 'Error';
$factory = new ControllerFactory();
$class = $factory->getControllerClass($request->withAttribute('params', $params));
if (!$class) {
/** @var string $class */
$class = App::className('Error', 'Controller', 'Controller');
}
/** @var \Cake\Controller\Controller $controller */
$controller = new $class($request);
$controller->startupProcess();
} catch (Throwable $e) {
$errorOccured = true;
}
if (!isset($controller)) {
return new Controller($request);
}
// Retry RequestHandler, as another aspect of startupProcess()
// could have failed. Ignore any exceptions out of startup, as
// there could be userland input data parsers.
if ($errorOccured && isset($controller->RequestHandler)) {
try {
$event = new Event('Controller.startup', $controller);
$controller->RequestHandler->startup($event);
} catch (Throwable $e) {
}
}
return $controller;
}
/**
* Clear output buffers so error pages display properly.
*
* @return void
*/
protected function clearOutput(): void
{
if (in_array(PHP_SAPI, ['cli', 'phpdbg'])) {
return;
}
while (ob_get_level()) {
ob_end_clean();
}
}
/**
* Renders the response for the exception.
*
* @return \Cake\Http\Response The response to be sent.
*/
public function render(): ResponseInterface
{
$exception = $this->error;
$code = $this->_code($exception);
$method = $this->_method($exception);
$template = $this->_template($exception, $method, $code);
$this->clearOutput();
if (method_exists($this, $method)) {
return $this->_customMethod($method, $exception);
}
$message = $this->_message($exception, $code);
$url = $this->controller->getRequest()->getRequestTarget();
$response = $this->controller->getResponse();
if ($exception instanceof CakeException) {
foreach ((array)$exception->responseHeader() as $key => $value) {
$response = $response->withHeader($key, $value);
}
}
$response = $response->withStatus($code);
$viewVars = [
'message' => $message,
'url' => h($url),
'error' => $exception,
'code' => $code,
];
$serialize = ['message', 'url', 'code'];
$isDebug = Configure::read('debug');
if ($isDebug) {
$trace = (array)Debugger::formatTrace($exception->getTrace(), [
'format' => 'array',
'args' => false,
]);
$origin = [
'file' => $exception->getFile() ?: 'null',
'line' => $exception->getLine() ?: 'null',
];
// Traces don't include the origin file/line.
array_unshift($trace, $origin);
$viewVars['trace'] = $trace;
$viewVars += $origin;
$serialize[] = 'file';
$serialize[] = 'line';
}
$this->controller->set($viewVars);
$this->controller->viewBuilder()->setOption('serialize', $serialize);
if ($exception instanceof CakeException && $isDebug) {
$this->controller->set($exception->getAttributes());
}
$this->controller->setResponse($response);
return $this->_outputMessage($template);
}
/**
* Render a custom error method/template.
*
* @param string $method The method name to invoke.
* @param \Throwable $exception The exception to render.
* @return \Cake\Http\Response The response to send.
*/
protected function _customMethod(string $method, Throwable $exception): Response
{
$result = $this->{$method}($exception);
$this->_shutdown();
if (is_string($result)) {
$result = $this->controller->getResponse()->withStringBody($result);
}
return $result;
}
/**
* Get method name
*
* @param \Throwable $exception Exception instance.
* @return string
*/
protected function _method(Throwable $exception): string
{
[, $baseClass] = namespaceSplit(get_class($exception));
if (substr($baseClass, -9) === 'Exception') {
$baseClass = substr($baseClass, 0, -9);
}
$method = Inflector::variable($baseClass) ?: 'error500';
return $this->method = $method;
}
/**
* Get error message.
*
* @param \Throwable $exception Exception.
* @param int $code Error code.
* @return string Error message
*/
protected function _message(Throwable $exception, int $code): string
{
$message = $exception->getMessage();
if (
!Configure::read('debug') &&
!($exception instanceof HttpException)
) {
if ($code < 500) {
$message = __d('cake', 'Not Found');
} else {
$message = __d('cake', 'An Internal Error Has Occurred.');
}
}
return $message;
}
/**
* Get template for rendering exception info.
*
* @param \Throwable $exception Exception instance.
* @param string $method Method name.
* @param int $code Error code.
* @return string Template name
*/
protected function _template(Throwable $exception, string $method, int $code): string
{
$isHttpException = $exception instanceof HttpException;
if (!Configure::read('debug') && !$isHttpException || $isHttpException) {
$template = 'error500';
if ($code < 500) {
$template = 'error400';
}
return $this->template = $template;
}
$template = $method ?: 'error500';
if ($exception instanceof PDOException) {
$template = 'pdo_error';
}
return $this->template = $template;
}
/**
* Get HTTP status code.
*
* @param \Throwable $exception Exception.
* @return int A valid HTTP error status code.
*/
protected function _code(Throwable $exception): int
{
$code = 500;
$errorCode = (int)$exception->getCode();
if ($errorCode >= 400 && $errorCode < 600) {
$code = $errorCode;
}
return $code;
}
/**
* Generate the response using the controller object.
*
* @param string $template The template to render.
* @return \Cake\Http\Response A response object that can be sent.
*/
protected function _outputMessage(string $template): Response
{
try {
$this->controller->render($template);
return $this->_shutdown();
} catch (MissingTemplateException $e) {
$attributes = $e->getAttributes();
if (
$e instanceof MissingLayoutException ||
(
isset($attributes['file']) &&
strpos($attributes['file'], 'error500') !== false
)
) {
return $this->_outputMessageSafe('error500');
}
return $this->_outputMessage('error500');
} catch (MissingPluginException $e) {
$attributes = $e->getAttributes();
if (isset($attributes['plugin']) && $attributes['plugin'] === $this->controller->getPlugin()) {
$this->controller->setPlugin(null);
}
return $this->_outputMessageSafe('error500');
} catch (Throwable $e) {
return $this->_outputMessageSafe('error500');
}
}
/**
* A safer way to render error messages, replaces all helpers, with basics
* and doesn't call component methods.
*
* @param string $template The template to render.
* @return \Cake\Http\Response A response object that can be sent.
*/
protected function _outputMessageSafe(string $template): Response
{
$builder = $this->controller->viewBuilder();
$builder
->setHelpers([], false)
->setLayoutPath('')
->setTemplatePath('Error');
$view = $this->controller->createView('View');
$response = $this->controller->getResponse()
->withType('html')
->withStringBody($view->render($template, 'error'));
$this->controller->setResponse($response);
return $response;
}
/**
* Run the shutdown events.
*
* Triggers the afterFilter and afterDispatch events.
*
* @return \Cake\Http\Response The response to serve.
*/
protected function _shutdown(): Response
{
$this->controller->dispatchEvent('Controller.shutdown');
return $this->controller->getResponse();
}
/**
* Returns an array that can be used to describe the internal state of this
* object.
*
* @return array
*/
public function __debugInfo(): array
{
return [
'error' => $this->error,
'request' => $this->request,
'controller' => $this->controller,
'template' => $this->template,
'method' => $this->method,
];
}
}