Middleware::__invoke()   B
last analyzed

Complexity

Conditions 5
Paths 7

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 5

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 24
ccs 14
cts 14
cp 1
rs 8.5125
cc 5
eloc 15
nc 7
nop 3
crap 5
1
<?php
2
3
namespace Jasny\ErrorHandler;
4
5
use Jasny\ErrorHandler;
6
use Psr\Http\Message\ServerRequestInterface;
7
use Psr\Http\Message\ResponseInterface;
8
use Jasny\HttpMessage\GlobalEnvironmentInterface;
9
10
/**
11
 * Use error handler as middleware
12
 */
13
class Middleware
14
{
15
    /**
16
     * @var ErrorHandler
17
     */
18
    protected $errorHandler;
19
    
20
    /**
21
     * Class constructor
22
     * 
23
     * @param ErrorHandler $errorHandler
24
     */
25 12
    public function __construct(ErrorHandler $errorHandler)
26
    {
27 12
        $this->errorHandler = $errorHandler;
28 12
    }
29
    
30
    /**
31
     * Run middleware action
32
     *
33
     * @param ServerRequestInterface $request
34
     * @param ResponseInterface      $response
35
     * @param callback               $next
36
     * @return ResponseInterface
37
     */
38 12
    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
39
    {
40 12
        if (!is_callable($next)) {
41 2
            throw new \InvalidArgumentException("'next' should be a callback");            
42
        }
43
44
        try {
45 10
            $nextResponse = $next($request, $response);
46 2
            $error = null;
47 8
        } catch (\Error $e) {
48 2
            $error = $e;
49 6
        } catch (\Exception $e) {
50 6
            $error = $e;
51
        }
52
        
53 10
        $this->errorHandler->setError($error);
54
        
55 10
        if ($error) {
56 8
            $this->errorHandler->log($error);
57 8
            $nextResponse = $this->errorResponse($request, $response);
58
        }
59
        
60 10
        return $nextResponse;
61
    }
62
63
    /**
64
     * Handle caught error
65
     *
66
     * @param ServerRequestInterface $request
67
     * @param ResponseInterface      $response
68
     * @return ResponseInterface
69
     */
70 8
    protected function errorResponse(ServerRequestInterface $request, ResponseInterface $response)
71
    {
72
        if (
73 8
            interface_exists(GlobalEnvironmentInterface::class, false) &&
74 8
            $response instanceof GlobalEnvironmentInterface &&
75 8
            $response->isStale()
76
        ) {
77 2
            $response = $response->revive();
78
        }
79
80 8
        $errorResponse = $response->withProtocolVersion($request->getProtocolVersion())->withStatus(500);
81 8
        $errorResponse->getBody()->write('An unexpected error occured');
82
83 8
        return $errorResponse;
84
    }
85
}
86
87