Test Failed
Pull Request — main (#59)
by Dimitri
06:14
created

Cors   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 3
Bugs 1 Features 0
Metric Value
eloc 32
c 3
b 1
f 0
dl 0
loc 119
ccs 0
cts 11
cp 0
rs 10
wmc 7

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 21 3
A process() 0 19 4
1
<?php
2
3
/**
4
 * This file is part of Blitz PHP framework.
5
 *
6
 * (c) 2022 Dimitri Sitchet Tomkeu <[email protected]>
7
 *
8
 * For the full copyright and license information, please view
9
 * the LICENSE file that was distributed with this source code.
10
 */
11
12
namespace BlitzPHP\Middlewares;
13
14
use BlitzPHP\Http\CorsBuilder;
15
use BlitzPHP\Utilities\String\Text;
16
use Psr\Http\Message\ResponseInterface;
17
use Psr\Http\Message\ServerRequestInterface;
18
use Psr\Http\Server\MiddlewareInterface;
19
use Psr\Http\Server\RequestHandlerInterface;
20
21
/**
22
 * Middleware cors pour gerer les requetes d'origine croisees
23
 *
24
 * @credit <a href="https://github.com/agungsugiarto/codeigniter4-cors">CodeIgniter4 Cors</a>
25
 * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
26
 */
27
class Cors implements MiddlewareInterface
28
{
29
    /**
30
     * --------------------------------------------------------------------------
31
     * En-têtes HTTP autorisés
32
     * --------------------------------------------------------------------------
33
     *
34
     * Indique les en-têtes HTTP autorisés.
35
     */
36
    public array $allowedHeaders = ['*'];
37
38
    /**
39
     * --------------------------------------------------------------------------
40
     * Méthodes HTTP autorisées
41
     * --------------------------------------------------------------------------
42
     *
43
     * Indique les méthodes HTTP autorisées.
44
     */
45
    public array $allowedMethods = ['*'];
46
47
    /**
48
     * --------------------------------------------------------------------------
49
     * Origine des requêtes autorisées
50
     * --------------------------------------------------------------------------
51
     *
52
     * Indique quelles origines sont autorisées à effectuer des demandes.
53
     * Les motifs sont également acceptés, par exemple *.foo.com
54
     */
55
    public array $allowedOrigins = ['*'];
56
57
    /**
58
     * --------------------------------------------------------------------------
59
     * Modèles d'origines autorisés
60
     * --------------------------------------------------------------------------
61
     *
62
     * Les motifs qui peuvent être utilisés avec `preg_match` pour correspondre à l'origine.
63
     */
64
    public array $allowedOriginsPatterns = [];
65
66
    /**
67
     * --------------------------------------------------------------------------
68
     * En-têtes exposés
69
     * --------------------------------------------------------------------------
70
     *
71
     * En-têtes qui sont autorisés à être exposés au serveur web.
72
     */
73
    public array $exposedHeaders = [];
74
75
    /**
76
     * --------------------------------------------------------------------------
77
     * Âge maximum
78
     * --------------------------------------------------------------------------
79
     *
80
     * Indique la durée pendant laquelle les résultats d'une demande de contrôle en amont peuvent être mis en cache.
81
     */
82
    public int $maxAge = 0;
83
84
    /**
85
     * --------------------------------------------------------------------------
86
     * Si la réponse peut être exposée ou non lorsque des informations d'identification sont présentes
87
     * --------------------------------------------------------------------------
88
     *
89
     * Indique si la réponse à la demande peut être exposée lorsque l'indicateur d'informations d'identification est vrai.
90
     * Lorsqu'il est utilisé dans le cadre d'une réponse à une demande de contrôle en amont, il indique si la demande proprement dite peut être effectuée en utilisant des informations d'identification.
91
     * Notez que les requêtes GET simples ne sont pas contrôlées au préalable, et donc si une requête est faite pour une ressource avec des informations d'identification, si cet en-tête n'est pas renvoyé avec la ressource, la réponse est ignorée par le navigateur et n'est pas renvoyée au contenu web.
92
     */
93
    public bool $supportsCredentials = false;
94
95
    protected CorsBuilder $cors;
96
97
    /**
98
     * Constructor.
99
     */
100
    public function __construct(array $config = [])
101
    {
102
        $params = (array) config('cors', []);
103
        $config = array_merge($params, $config);
104
105
        foreach ($config as $key => $value) {
106
            $key = Text::camel($key);
107
108
            if (property_exists($this, $key)) {
109
                $this->{$key} = $value;
110
            }
111
        }
112
113
        $this->cors = new CorsBuilder([
114
            'allowedHeaders'         => $this->allowedHeaders,
115
            'allowedMethods'         => $this->allowedMethods,
116
            'allowedOrigins'         => $this->allowedOrigins,
117
            'allowedOriginsPatterns' => $this->allowedOriginsPatterns,
118
            'exposedHeaders'         => $this->exposedHeaders,
119
            'maxAge'                 => $this->maxAge,
120
            'supportsCredentials'    => $this->supportsCredentials,
121
        ]);
122
    }
123
124
    /**
125
     * Execution du middleware
126
     */
127
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
128
    {
129
        if ($this->cors->isPreflightRequest($request)) {
130
            $response = $this->cors->handlePreflightRequest($request);
131
132
            return $this->cors->varyHeader($response, 'Access-Control-Request-Method');
133
        }
134
135
        $response = $handler->handle($request);
136
137
        if ($request->getMethod() === 'OPTIONS') {
138
            $response = $this->cors->varyHeader($response, 'Access-Control-Request-Method');
139
        }
140
141
        if (! $response->hasHeader('Access-Control-Allow-Origin')) {
142
            $response = $this->cors->addActualRequestHeaders($request, $response);
143
        }
144
145
        return $response;
146
    }
147
}
148