api de gestion de ticket, basé sur php-crud-api. Le but est de décorrélé les outils de gestion des données, afin
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CorsMiddleware.php 4.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace Tqdev\PhpCrudApi\Middleware;
  3. use Psr\Http\Message\ResponseInterface;
  4. use Psr\Http\Message\ServerRequestInterface;
  5. use Psr\Http\Server\RequestHandlerInterface;
  6. use Tqdev\PhpCrudApi\Controller\Responder;
  7. use Tqdev\PhpCrudApi\Middleware\Base\Middleware;
  8. use Tqdev\PhpCrudApi\Middleware\Router\Router;
  9. use Tqdev\PhpCrudApi\Record\ErrorCode;
  10. use Tqdev\PhpCrudApi\ResponseFactory;
  11. use Tqdev\PhpCrudApi\ResponseUtils;
  12. class CorsMiddleware extends Middleware
  13. {
  14. private $debug;
  15. public function __construct(Router $router, Responder $responder, array $properties, bool $debug)
  16. {
  17. parent::__construct($router, $responder, $properties);
  18. $this->debug = $debug;
  19. }
  20. private function isOriginAllowed(string $origin, string $allowedOrigins): bool
  21. {
  22. $found = false;
  23. foreach (explode(',', $allowedOrigins) as $allowedOrigin) {
  24. $hostname = preg_quote(strtolower(trim($allowedOrigin)));
  25. $regex = '/^' . str_replace('\*', '.*', $hostname) . '$/';
  26. if (preg_match($regex, $origin)) {
  27. $found = true;
  28. break;
  29. }
  30. }
  31. return $found;
  32. }
  33. public function process(ServerRequestInterface $request, RequestHandlerInterface $next): ResponseInterface
  34. {
  35. $method = $request->getMethod();
  36. $origin = count($request->getHeader('Origin')) ? $request->getHeader('Origin')[0] : '';
  37. $allowedOrigins = $this->getProperty('allowedOrigins', '*');
  38. if ($origin && !$this->isOriginAllowed($origin, $allowedOrigins)) {
  39. $response = $this->responder->error(ErrorCode::ORIGIN_FORBIDDEN, $origin);
  40. } elseif ($method == 'OPTIONS') {
  41. $response = ResponseFactory::fromStatus(ResponseFactory::OK);
  42. $allowHeaders = $this->getProperty('allowHeaders', 'Content-Type, X-XSRF-TOKEN, X-Authorization');
  43. if ($this->debug) {
  44. $allowHeaders = implode(', ', array_filter([$allowHeaders, 'X-Exception-Name, X-Exception-Message, X-Exception-File']));
  45. }
  46. if ($allowHeaders) {
  47. $response = $response->withHeader('Access-Control-Allow-Headers', $allowHeaders);
  48. }
  49. $allowMethods = $this->getProperty('allowMethods', 'OPTIONS, GET, PUT, POST, DELETE, PATCH');
  50. if ($allowMethods) {
  51. $response = $response->withHeader('Access-Control-Allow-Methods', $allowMethods);
  52. }
  53. $allowCredentials = $this->getProperty('allowCredentials', 'true');
  54. if ($allowCredentials) {
  55. $response = $response->withHeader('Access-Control-Allow-Credentials', $allowCredentials);
  56. }
  57. $maxAge = $this->getProperty('maxAge', '1728000');
  58. if ($maxAge) {
  59. $response = $response->withHeader('Access-Control-Max-Age', $maxAge);
  60. }
  61. $exposeHeaders = $this->getProperty('exposeHeaders', '');
  62. if ($this->debug) {
  63. $exposeHeaders = implode(', ', array_filter([$exposeHeaders, 'X-Exception-Name, X-Exception-Message, X-Exception-File']));
  64. }
  65. if ($exposeHeaders) {
  66. $response = $response->withHeader('Access-Control-Expose-Headers', $exposeHeaders);
  67. }
  68. } else {
  69. $response = null;
  70. try {
  71. $response = $next->handle($request);
  72. } catch (\Throwable $e) {
  73. $response = $this->responder->error(ErrorCode::ERROR_NOT_FOUND, $e->getMessage());
  74. if ($this->debug) {
  75. $response = ResponseUtils::addExceptionHeaders($response, $e);
  76. }
  77. }
  78. }
  79. if ($origin) {
  80. $allowCredentials = $this->getProperty('allowCredentials', 'true');
  81. if ($allowCredentials) {
  82. $response = $response->withHeader('Access-Control-Allow-Credentials', $allowCredentials);
  83. }
  84. $response = $response->withHeader('Access-Control-Allow-Origin', $origin);
  85. }
  86. return $response;
  87. }
  88. }