Lines
0.00%
0 / 43
Methods
0.00%
0 / 1
Classes
0.00%
0 / 1
| Name | Lines | Methods | CRAP | ||||
|---|---|---|---|---|---|---|---|
| __invoke | 0.00% | 0 / 43 | 0.00% | 0 / 1 | 132 | ||
| 15 | class ErrorHandler implements ErrorHandlerInterface | |
| 16 | { | |
| 17 | /** | |
| 18 | * @SuppressWarnings("PMD.UnusedFormalParameter") | |
| 19 | * @SuppressWarnings(Complexity) | |
| 20 | */ | |
| 21 | #[\Override] | |
| 22 | public function __invoke( | |
| 23 | ServerRequestInterface $request, | |
| 24 | \Throwable $exception, | |
| 25 | bool $displayErrorDetails, | |
| 26 | bool $logErrors, | |
| 27 | bool $logErrorDetails | |
| 28 | ): ResponseInterface { | |
| 29 | $response = \App::$slim->getResponseFactory()->createResponse(); | |
| 30 | if ($exception instanceof \Slim\Exception\HttpNotFoundException) { | |
| 31 | $message = \BO\Zmsbackend\Api\Response\Message::create($request); | |
| 32 | $message->meta['error'] = true; | |
| 33 | $message->meta['message'] = "Could not find a resource with the given URL " . $request->getUri()->getPath(); | |
| 34 | $response = \BO\Slim\Render::withLastModified($response, time(), '0'); | |
| 35 | return Render::withJson($response, $message, 404); | |
| 36 | } | |
| 37 | ||
| 38 | $message = \BO\Zmsbackend\Api\Response\Message::create($request); | |
| 39 | $message->meta['error'] = true; | |
| 40 | $message->meta['message'] = $exception->getMessage(); | |
| 41 | $message->meta['exception'] = get_class($exception); | |
| 42 | $trace = ''; | |
| 43 | foreach (array_slice($exception->getTrace(), 0, 10) as $call) { | |
| 44 | $trace .= "\\"; | |
| 45 | $trace .= $call['class'] ?? ''; | |
| 46 | $trace .= "::"; | |
| 47 | $trace .= $call['function'] ?? ''; | |
| 48 | $trace .= " +"; | |
| 49 | $trace .= isset($call['line']) ? (string) $call['line'] : ''; | |
| 50 | $trace .= "\n"; | |
| 51 | } | |
| 52 | $trace = Sanitizer::sanitizeStackTrace($trace); | |
| 53 | $message->meta['trace'] = $trace; | |
| 54 | ||
| 55 | $exceptionVars = get_object_vars($exception); | |
| 56 | if ($exception instanceof \BO\Zmsbackend\Useraccount\Exception\UserAlreadyLoggedIn) { | |
| 57 | $message->data = $exception->getData(); | |
| 58 | } elseif (array_key_exists('data', $exceptionVars)) { | |
| 59 | $message->data = $exceptionVars['data']; | |
| 60 | } | |
| 61 | $response = \BO\Slim\Render::withLastModified($response, time(), '0'); | |
| 62 | $code = (int) $exception->getCode(); | |
| 63 | $status = 500; | |
| 64 | if ($code >= 200 && $code <= 599) { | |
| 65 | $status = $code; | |
| 66 | } | |
| 67 | if ($code >= 500 || $code === 0) { | |
| 68 | $collapsedTrace = preg_replace("#(\s)+#", ' ', str_replace('\\', ':', $trace)); | |
| 69 | \App::$log->critical( | |
| 70 | "[API] Fatal Exception: " | |
| 71 | . " in " . $exception->getFile() . " +" . $exception->getLine() | |
| 72 | . " -> " . $exception->getMessage() | |
| 73 | . " | Trace: " . Sanitizer::sanitizeStackTrace( | |
| 74 | is_string($collapsedTrace) ? $collapsedTrace : $trace | |
| 75 | ) | |
| 76 | ); | |
| 77 | } | |
| 78 | return Render::withJson($response, $message, $status); | |
| 79 | } | |
| 80 | } |