1616use Symfony \Component \HttpFoundation \Request ;
1717use Symfony \Component \HttpFoundation \Response ;
1818
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+ */
1947class CorsService
2048{
49+ /** @var CorsNormalizedOptions */
2150 private $ options ;
2251
52+ /**
53+ * @param CorsInputOptions $options
54+ */
2355 public function __construct (array $ options = [])
2456 {
2557 $ this ->options = $ this ->normalizeOptions ($ options );
2658 }
2759
60+ /**
61+ * @param CorsInputOptions $options
62+ * @return CorsNormalizedOptions
63+ */
2864 private function normalizeOptions (array $ options = []): array
2965 {
3066 $ aliases = [
@@ -191,7 +227,7 @@ public function addActualRequestHeaders(Response $response, Request $request): R
191227 return $ response ;
192228 }
193229
194- private function configureAllowedOrigin (Response $ response , Request $ request )
230+ private function configureAllowedOrigin (Response $ response , Request $ request ): void
195231 {
196232 if ($ this ->options ['allowedOrigins ' ] === true && !$ this ->options ['supportsCredentials ' ]) {
197233 // Safe+cacheable, allow everything
@@ -211,14 +247,14 @@ private function configureAllowedOrigin(Response $response, Request $request)
211247
212248 private function isSingleOriginAllowed (): bool
213249 {
214- if ($ this ->options ['allowedOrigins ' ] === true || ! empty ($ this ->options ['allowedOriginsPatterns ' ])) {
250+ if ($ this ->options ['allowedOrigins ' ] === true || count ($ this ->options ['allowedOriginsPatterns ' ]) > 0 ) {
215251 return false ;
216252 }
217253
218254 return count ($ this ->options ['allowedOrigins ' ]) === 1 ;
219255 }
220256
221- private function configureAllowedMethods (Response $ response , Request $ request )
257+ private function configureAllowedMethods (Response $ response , Request $ request ): void
222258 {
223259 if ($ this ->options ['allowedMethods ' ] === true ) {
224260 $ allowMethods = strtoupper ($ request ->headers ->get ('Access-Control-Request-Method ' ));
@@ -230,7 +266,7 @@ private function configureAllowedMethods(Response $response, Request $request)
230266 $ response ->headers ->set ('Access-Control-Allow-Methods ' , $ allowMethods );
231267 }
232268
233- private function configureAllowedHeaders (Response $ response , Request $ request )
269+ private function configureAllowedHeaders (Response $ response , Request $ request ): void
234270 {
235271 if ($ this ->options ['allowedHeaders ' ] === true ) {
236272 $ allowHeaders = $ request ->headers ->get ('Access-Control-Request-Headers ' );
@@ -241,28 +277,28 @@ private function configureAllowedHeaders(Response $response, Request $request)
241277 $ response ->headers ->set ('Access-Control-Allow-Headers ' , $ allowHeaders );
242278 }
243279
244- private function configureAllowCredentials (Response $ response , Request $ request )
280+ private function configureAllowCredentials (Response $ response , Request $ request ): void
245281 {
246282 if ($ this ->options ['supportsCredentials ' ]) {
247283 $ response ->headers ->set ('Access-Control-Allow-Credentials ' , 'true ' );
248284 }
249285 }
250286
251- private function configureExposedHeaders (Response $ response , Request $ request )
287+ private function configureExposedHeaders (Response $ response , Request $ request ): void
252288 {
253289 if ($ this ->options ['exposedHeaders ' ]) {
254290 $ response ->headers ->set ('Access-Control-Expose-Headers ' , implode (', ' , $ this ->options ['exposedHeaders ' ]));
255291 }
256292 }
257293
258- private function configureMaxAge (Response $ response , Request $ request )
294+ private function configureMaxAge (Response $ response , Request $ request ): void
259295 {
260296 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 ' ]);
262298 }
263299 }
264300
265- public function varyHeader (Response $ response , $ header ): Response
301+ public function varyHeader (Response $ response , string $ header ): Response
266302 {
267303 if (!$ response ->headers ->has ('Vary ' )) {
268304 $ response ->headers ->set ('Vary ' , $ header );
0 commit comments