16
16
use Symfony \Component \HttpFoundation \Request ;
17
17
use Symfony \Component \HttpFoundation \Response ;
18
18
19
+ /**
20
+ * @phpstan-type CorsInputOptions array{
21
+ * 'allowedOrigins'?: array{string}|array{},
22
+ * 'allowedOriginsPatterns'?: array{string}|array{},
23
+ * 'supportsCredentials'?: bool,
24
+ * 'allowedHeaders'?: array{string}|array{},
25
+ * 'allowedMethods'?: array{string}|array{},
26
+ * 'exposedHeaders'?: array{string}|array{},
27
+ * 'maxAge'?: int|bool|null,
28
+ * 'allowed_origins'?: array{string}|array{},
29
+ * 'allowed_origins_patterns'?: array{string}|array{},
30
+ * 'supports_credentials'?: bool,
31
+ * 'allowed_headers'?: array{string}|array{},
32
+ * 'allowed_methods'?: array{string}|array{},
33
+ * 'exposed_headers'?: array{string}|array{},
34
+ * 'max_age'?: int|bool|null
35
+ * }
36
+ *
37
+ * @phpstan-type CorsNormalizedOptions array{
38
+ * 'allowedOrigins': array{string}|array{}|true,
39
+ * 'allowedOriginsPatterns': array{string}|array{},
40
+ * 'supportsCredentials': bool,
41
+ * 'allowedHeaders': array{string}|array{}|bool,
42
+ * 'allowedMethods': array{string}|array{}|bool,
43
+ * 'exposedHeaders': array{string}|array{},
44
+ * 'maxAge': int|bool|null
45
+ * }
46
+ */
19
47
class CorsService
20
48
{
49
+ /** @var CorsNormalizedOptions */
21
50
private $ options ;
22
51
52
+ /**
53
+ * @param CorsInputOptions $options
54
+ */
23
55
public function __construct (array $ options = [])
24
56
{
25
57
$ this ->options = $ this ->normalizeOptions ($ options );
26
58
}
27
59
60
+ /**
61
+ * @param CorsInputOptions $options
62
+ * @return CorsNormalizedOptions
63
+ */
28
64
private function normalizeOptions (array $ options = []): array
29
65
{
30
66
$ aliases = [
@@ -191,7 +227,7 @@ public function addActualRequestHeaders(Response $response, Request $request): R
191
227
return $ response ;
192
228
}
193
229
194
- private function configureAllowedOrigin (Response $ response , Request $ request )
230
+ private function configureAllowedOrigin (Response $ response , Request $ request ): void
195
231
{
196
232
if ($ this ->options ['allowedOrigins ' ] === true && !$ this ->options ['supportsCredentials ' ]) {
197
233
// Safe+cacheable, allow everything
@@ -211,14 +247,14 @@ private function configureAllowedOrigin(Response $response, Request $request)
211
247
212
248
private function isSingleOriginAllowed (): bool
213
249
{
214
- if ($ this ->options ['allowedOrigins ' ] === true || ! empty ($ this ->options ['allowedOriginsPatterns ' ])) {
250
+ if ($ this ->options ['allowedOrigins ' ] === true || count ($ this ->options ['allowedOriginsPatterns ' ]) > 0 ) {
215
251
return false ;
216
252
}
217
253
218
254
return count ($ this ->options ['allowedOrigins ' ]) === 1 ;
219
255
}
220
256
221
- private function configureAllowedMethods (Response $ response , Request $ request )
257
+ private function configureAllowedMethods (Response $ response , Request $ request ): void
222
258
{
223
259
if ($ this ->options ['allowedMethods ' ] === true ) {
224
260
$ allowMethods = strtoupper ($ request ->headers ->get ('Access-Control-Request-Method ' ));
@@ -230,7 +266,7 @@ private function configureAllowedMethods(Response $response, Request $request)
230
266
$ response ->headers ->set ('Access-Control-Allow-Methods ' , $ allowMethods );
231
267
}
232
268
233
- private function configureAllowedHeaders (Response $ response , Request $ request )
269
+ private function configureAllowedHeaders (Response $ response , Request $ request ): void
234
270
{
235
271
if ($ this ->options ['allowedHeaders ' ] === true ) {
236
272
$ allowHeaders = $ request ->headers ->get ('Access-Control-Request-Headers ' );
@@ -241,28 +277,28 @@ private function configureAllowedHeaders(Response $response, Request $request)
241
277
$ response ->headers ->set ('Access-Control-Allow-Headers ' , $ allowHeaders );
242
278
}
243
279
244
- private function configureAllowCredentials (Response $ response , Request $ request )
280
+ private function configureAllowCredentials (Response $ response , Request $ request ): void
245
281
{
246
282
if ($ this ->options ['supportsCredentials ' ]) {
247
283
$ response ->headers ->set ('Access-Control-Allow-Credentials ' , 'true ' );
248
284
}
249
285
}
250
286
251
- private function configureExposedHeaders (Response $ response , Request $ request )
287
+ private function configureExposedHeaders (Response $ response , Request $ request ): void
252
288
{
253
289
if ($ this ->options ['exposedHeaders ' ]) {
254
290
$ response ->headers ->set ('Access-Control-Expose-Headers ' , implode (', ' , $ this ->options ['exposedHeaders ' ]));
255
291
}
256
292
}
257
293
258
- private function configureMaxAge (Response $ response , Request $ request )
294
+ private function configureMaxAge (Response $ response , Request $ request ): void
259
295
{
260
296
if ($ this ->options ['maxAge ' ] !== null ) {
261
- $ response ->headers ->set ('Access-Control-Max-Age ' , (int ) $ this ->options ['maxAge ' ]);
297
+ $ response ->headers ->set ('Access-Control-Max-Age ' , (string ) $ this ->options ['maxAge ' ]);
262
298
}
263
299
}
264
300
265
- public function varyHeader (Response $ response , $ header ): Response
301
+ public function varyHeader (Response $ response , string $ header ): Response
266
302
{
267
303
if (!$ response ->headers ->has ('Vary ' )) {
268
304
$ response ->headers ->set ('Vary ' , $ header );
0 commit comments