Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
0.00% |
0 / 41 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 1 |
| ErrorHandler | |
0.00% |
0 / 41 |
|
0.00% |
0 / 1 |
110 | |
0.00% |
0 / 1 |
| __invoke | |
0.00% |
0 / 41 |
|
0.00% |
0 / 1 |
110 | |||
| 1 | <?php |
| 2 | |
| 3 | namespace BO\Zmsbackend\Helper; |
| 4 | |
| 5 | use BO\Slim\Render; |
| 6 | use BO\Slim\Helper\Sanitizer; |
| 7 | use Psr\Http\Message\ResponseInterface; |
| 8 | use Psr\Http\Message\ServerRequestInterface; |
| 9 | use Slim\Interfaces\ErrorHandlerInterface; |
| 10 | |
| 11 | /** |
| 12 | * |
| 13 | * @SuppressWarnings(CouplingBetweenObjects) |
| 14 | */ |
| 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 (array_key_exists('data', $exceptionVars)) { |
| 57 | $message->data = $exceptionVars['data']; |
| 58 | } |
| 59 | $response = \BO\Slim\Render::withLastModified($response, time(), '0'); |
| 60 | $code = (int) $exception->getCode(); |
| 61 | $status = 500; |
| 62 | if ($code >= 200 && $code <= 599) { |
| 63 | $status = $code; |
| 64 | } |
| 65 | if ($code >= 500 || $code === 0) { |
| 66 | $collapsedTrace = preg_replace("#(\s)+#", ' ', str_replace('\\', ':', $trace)); |
| 67 | \App::$log->critical( |
| 68 | "[API] Fatal Exception: " |
| 69 | . " in " . $exception->getFile() . " +" . $exception->getLine() |
| 70 | . " -> " . $exception->getMessage() |
| 71 | . " | Trace: " . Sanitizer::sanitizeStackTrace( |
| 72 | is_string($collapsedTrace) ? $collapsedTrace : $trace |
| 73 | ) |
| 74 | ); |
| 75 | } |
| 76 | return Render::withJson($response, $message, $status); |
| 77 | } |
| 78 | } |