vendor/launchpad/backend/src/Base/EventListener/CorsListener.php line 42

Open in your IDE?
  1. <?php
  2. namespace LaunchPad\Bundle\LaunchPadBundle\Base\EventListener;
  3. use Psr\Container\ContainerInterface;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. final class CorsListener implements EventSubscriberInterface
  10. {
  11.     private $config;
  12.     /**
  13.      * CorsListener constructor.
  14.      * @param array $config
  15.      */
  16.     public function __construct(array $config)
  17.     {
  18.         $this->config $config['cors'];
  19.     }
  20.     /**
  21.      * @return array
  22.      */
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             KernelEvents::REQUEST => ['onKernelRequest'9999],
  27.             KernelEvents::RESPONSE => ['onKernelResponse'9999],
  28.         ];
  29.     }
  30.     /**
  31.      * @param ResponseEvent $event
  32.      * @return void
  33.      */
  34.     public function onKernelRequest(RequestEvent $event)
  35.     {
  36.         if (!$event->isMasterRequest()) {
  37.             return;
  38.         }
  39.         $defaultHeaders $this->getDefaultHeaders();
  40.         if ($event->getRequest()->getMethod() === 'OPTIONS') {
  41.             $event->setResponse(
  42.                 new Response(
  43.                     '',
  44.                     200,
  45.                     $defaultHeaders + ['Content-Length' => 0]
  46.                 )
  47.             );
  48.             return ;
  49.         }
  50.     }
  51.     /**
  52.      * @param ResponseEvent $event
  53.      * @return void
  54.      */
  55.     public function onKernelResponse(ResponseEvent $event): void
  56.     {
  57.         if (!$event->isMasterRequest()) {
  58.             return;
  59.         }
  60.         $defaultHeaders $this->getDefaultHeaders();
  61.         $response $event->getResponse();
  62.         if (!$response) {
  63.             return;
  64.         }
  65.         foreach($defaultHeaders as $headerName => $headerValue) {
  66.             $response->headers->set($headerName$headerValue);
  67.         }
  68.     }
  69.     /**
  70.      * Get default headers
  71.      *
  72.      * @return array
  73.      */
  74.     private function getDefaultHeaders()
  75.     {
  76.         return [
  77.             'Access-Control-Allow-Origin' => $this->getConfig('allow_origin'),
  78.             'Access-Control-Allow-Methods' => $this->getConfig('allow_methods'),
  79.             'Access-Control-Allow-Headers' => $this->getConfig('allow_headers'),
  80.         ];
  81.     }
  82.     /**
  83.      * @param $key
  84.      * @return mixed|null
  85.      */
  86.     private function getConfig($key)
  87.     {
  88.         return $this->config[$key] ?? null;
  89.     }
  90. }