Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
ErrorHandler
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
2 / 2
4
100.00% covered (success)
100.00%
1 / 1
 response
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 normalize
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray\View\Boiler\Error;
6
7use Celema\Core\Error\Handler;
8use Celema\Quma\Exception\ConnectionFailed;
9use Cosray\Exception\DatabaseUnavailable;
10use Override;
11use Psr\Http\Message\ResponseInterface as Response;
12use Psr\Http\Message\ServerRequestInterface as Request;
13use Throwable;
14
15/** Answers a database that cannot be reached with 503 instead of 500. */
16final class ErrorHandler extends Handler
17{
18    private const int RETRY_AFTER = 30;
19
20    #[Override]
21    public function response(Throwable $exception, Request $request): Response
22    {
23        $response = parent::response($exception, $request);
24
25        return $exception instanceof ConnectionFailed
26            ? $response->withHeader('Retry-After', (string) self::RETRY_AFTER)
27            : $response;
28    }
29
30    #[Override]
31    protected function normalize(Throwable $exception, Request $request): Throwable
32    {
33        if ($exception instanceof ConnectionFailed) {
34            return new DatabaseUnavailable($request, previous: $exception);
35        }
36
37        return parent::normalize($exception, $request);
38    }
39}