ErrorMiddleware   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 71
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 37
c 1
b 1
f 0
dl 0
loc 71
ccs 0
cts 37
cp 0
rs 10
wmc 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A process() 0 27 4
A __construct() 0 3 1
A setErrorHandler() 0 16 2
A getErrorResponse() 0 11 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Antidot\React\PSR15\Middleware;
6
7
use Antidot\React\PSR15\Response\PromiseResponse;
8
use ErrorException;
9
use Franzl\Middleware\Whoops\WhoopsMiddleware;
10
use Franzl\Middleware\Whoops\WhoopsRunner;
11
use Psr\Http\Message\ResponseInterface;
12
use Psr\Http\Message\ServerRequestInterface;
13
use Psr\Http\Server\MiddlewareInterface;
14
use Psr\Http\Server\RequestHandlerInterface;
15
use React\Http\Message\Response;
16
use Throwable;
17
18
use function React\Promise\resolve;
19
20
class ErrorMiddleware implements MiddlewareInterface
21
{
22
    private bool $debug;
23
24
    public function __construct(bool $debug)
25
    {
26
        $this->debug = $debug;
27
    }
28
29
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
30
    {
31
        $debug = $this->debug;
32
33
        return new PromiseResponse(
34
            resolve($request)
35
                ->then(
36
                    static function (ServerRequestInterface $request) use ($handler, $debug) {
37
                        self::setErrorHandler();
38
                        try {
39
                            if ($debug && class_exists(WhoopsMiddleware::class)) {
40
                                $response = resolve(new WhoopsMiddleware())
41
                                    ->then(
42
                                        static fn(WhoopsMiddleware $whoopsMiddleware) =>
43
                                            $whoopsMiddleware->process($request, $handler)
44
                                    );
45
                                restore_error_handler();
46
                                return $response;
47
                            }
48
49
                            $response = resolve($handler->handle($request));
50
                            restore_error_handler();
51
52
                            return $response;
53
                        } catch (Throwable $exception) {
54
                            restore_error_handler();
55
                            return resolve(self::getErrorResponse($exception, $request, $debug));
56
                        }
57
                    }
58
                )
59
        );
60
    }
61
62
    private static function setErrorHandler(): void
63
    {
64
        $handler = static function (
65
            int $errorNumber,
66
            string $errorString,
67
            string $errorFile,
68
            int $errorLine,
69
            ?array $errorContext
0 ignored issues
show
Unused Code introduced by
The parameter $errorContext is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

69
            /** @scrutinizer ignore-unused */ ?array $errorContext

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
70
        ): bool {
71
            if (!(error_reporting() & $errorNumber)) {
72
                return false;
73
            }
74
            throw new ErrorException($errorString, 0, $errorNumber, $errorFile, $errorLine);
75
        };
76
77
        set_error_handler($handler);
78
    }
79
80
    private static function getErrorResponse(
81
        Throwable $exeption,
82
        ServerRequestInterface $request,
83
        bool $debug
84
    ): ResponseInterface {
85
        if ($debug && class_exists(WhoopsRunner::class)) {
86
            $whoops = new WhoopsRunner();
87
            return $whoops->handle($exeption, $request);
88
        }
89
90
        return new Response(500, [], 'Unexpected Server Error Occurred');
91
    }
92
}
93