Cors::responsePreFlight()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 1
dl 0
loc 9
ccs 0
cts 9
cp 0
crap 2
rs 9.6666
c 0
b 0
f 0
1
<?php
2
namespace Wandu\Router\Middleware;
3
4
use Closure;
5
use Neomerx\Cors\Contracts\AnalysisResultInterface;
6
use Neomerx\Cors\Contracts\AnalyzerInterface;
7
use Psr\Http\Message\ResponseInterface;
8
use Psr\Http\Message\ServerRequestInterface;
9
use Wandu\Router\Contracts\MiddlewareInterface;
10
use function Wandu\Http\Response\json;
11
12
class Cors implements MiddlewareInterface
13
{
14
    /** @var \Neomerx\Cors\Contracts\AnalyzerInterface */
15
    protected $analyzer;
16
17
    public function __construct(AnalyzerInterface $analyzer)
18
    {
19
        $this->analyzer = $analyzer;
20
    }
21
22
    /**
23
     * {@inheritdoc}
24
     */
25
    public function __invoke(ServerRequestInterface $request, Closure $next)
26
    {
27
        $cors = $this->analyzer->analyze($request);
28
        
29
        switch ($cors->getRequestType()) {
30
            case AnalysisResultInterface::ERR_NO_HOST_HEADER:
31
            case AnalysisResultInterface::ERR_ORIGIN_NOT_ALLOWED:
32
            case AnalysisResultInterface::ERR_METHOD_NOT_SUPPORTED:
33
            case AnalysisResultInterface::ERR_HEADERS_NOT_SUPPORTED:
34
                return $this->responseError($cors);
35
            case AnalysisResultInterface::TYPE_PRE_FLIGHT_REQUEST:
36
                return $this->responsePreFlight($cors);
37
            case AnalysisResultInterface::TYPE_REQUEST_OUT_OF_CORS_SCOPE:
38
                return $next($request);
39
        }
40
        return $this->applyHeaders($next($request), $cors->getResponseHeaders());
41
    }
42
43
    /**
44
     * @param \Neomerx\Cors\Contracts\AnalysisResultInterface $cors
45
     * @return \Psr\Http\Message\ResponseInterface
46
     */
47
    protected function responseError(AnalysisResultInterface $cors): ResponseInterface
48
    {
49
        return json([
50
            'success' => false,
51
            'code' => $cors->getRequestType(),
52
        ], 403);
53
    }
54
    
55
    /**
56
     * @param \Neomerx\Cors\Contracts\AnalysisResultInterface $cors
57
     * @return \Psr\Http\Message\ResponseInterface
58
     */
59
    protected function responsePreFlight(AnalysisResultInterface $cors): ResponseInterface
60
    {
61
        return $this->applyHeaders(
62
            json([
63
                'success' => true,
64
            ]),
65
            $cors->getResponseHeaders()
66
        );
67
    }
68
    
69
    /**
70
     * @param \Psr\Http\Message\ResponseInterface $response
71
     * @param array $headers
72
     * @return \Psr\Http\Message\ResponseInterface
73
     */
74
    protected function applyHeaders(ResponseInterface $response, array $headers = []): ResponseInterface
75
    {
76
        foreach ($headers as $name => $value) {
77
            $response = $response->withHeader($name, $value);
78
        }
79
        return $response;
80
    }
81
}
82