1 | <?php |
||
9 | class Cors |
||
10 | { |
||
11 | private $app; |
||
12 | |||
13 | 29 | public function __construct(Application $app) |
|
17 | |||
18 | 25 | public function __invoke(Request $request, Response $response) |
|
22 | |||
23 | 25 | private function corsHeaders(Request $request, $allow) |
|
24 | { |
||
25 | 25 | $headers = []; |
|
26 | |||
27 | 25 | if (!$this->isCorsRequest($request)) { |
|
28 | 2 | return []; |
|
29 | } |
||
30 | |||
31 | 23 | if ($this->isPreflightRequest($request)) { |
|
32 | 8 | $requestMethod = $request->headers->get("Access-Control-Request-Method"); |
|
33 | 8 | if (!$this->isMethodAllowed($requestMethod, $allow)) { |
|
34 | 2 | return []; |
|
35 | } |
||
36 | |||
37 | 6 | $requestHeaders = $request->headers->get("Access-Control-Request-Headers"); |
|
38 | 6 | if (!$this->areHeadersAllowed($requestHeaders)) { |
|
39 | 1 | return []; |
|
40 | } |
||
41 | |||
42 | 5 | $headers["Access-Control-Allow-Headers"] = $requestHeaders; |
|
43 | 5 | $headers["Access-Control-Allow-Methods"] = $requestMethod; |
|
44 | 5 | $headers["Access-Control-Max-Age"] = $this->app["cors.maxAge"]; |
|
45 | } else { |
||
46 | 15 | $headers["Access-Control-Expose-Headers"] = $this->app["cors.exposeHeaders"]; |
|
47 | } |
||
48 | |||
49 | 20 | $headers["Access-Control-Allow-Origin"] = $this->allowOrigin($request); |
|
50 | 20 | $headers["Access-Control-Allow-Credentials"] = $this->allowCredentials(); |
|
51 | |||
52 | 20 | return array_filter($headers); |
|
53 | } |
||
54 | |||
55 | 25 | private function isCorsRequest(Request $request) |
|
59 | |||
60 | 23 | private function isPreflightRequest(Request $request) |
|
64 | |||
65 | 8 | private function isMethodAllowed($requestMethod, $allow) |
|
71 | |||
72 | 6 | private function areHeadersAllowed($commaSeparatedRequestHeaders) |
|
81 | |||
82 | 20 | private function allowOrigin(Request $request) |
|
83 | { |
||
84 | 20 | $origin = $request->headers->get("Origin"); |
|
85 | 20 | if ($this->app["cors.allowOrigin"] === "*") { |
|
86 | 14 | $this->app["cors.allowOrigin"] = $origin; |
|
87 | } |
||
88 | |||
89 | 20 | $origins = array_filter(preg_split('/\s+/', $this->app["cors.allowOrigin"])); |
|
90 | 20 | foreach ($origins as $domain) { |
|
91 | 20 | if (preg_match($this->domainToRegex($domain), $origin)) { |
|
92 | 20 | return $origin; |
|
93 | } |
||
94 | } |
||
95 | |||
96 | 1 | return "null"; |
|
97 | } |
||
98 | |||
99 | 20 | private function domainToRegex($domain) |
|
103 | |||
104 | 20 | private function allowCredentials() |
|
108 | } |
||
109 |