<?php
namespace LaunchPad\Bundle\LaunchPadBundle\Base\EventListener;
use Psr\Container\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
final class CorsListener implements EventSubscriberInterface
{
private $config;
/**
* CorsListener constructor.
* @param array $config
*/
public function __construct(array $config)
{
$this->config = $config['cors'];
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => ['onKernelResponse', 9999],
];
}
/**
* @param ResponseEvent $event
* @return void
*/
public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMasterRequest()) {
return;
}
$defaultHeaders = $this->getDefaultHeaders();
if ($event->getRequest()->getMethod() === 'OPTIONS') {
$event->setResponse(
new Response(
'',
200,
$defaultHeaders + ['Content-Length' => 0]
)
);
return ;
}
$response = $event->getResponse();
if (!$response) {
return;
}
foreach($defaultHeaders as $headerName => $headerValue) {
$response->headers->set($headerName, $headerValue);
}
}
/**
* Get default headers
*
* @return array
*/
private function getDefaultHeaders()
{
return [
'Access-Control-Allow-Origin' => $this->getConfig('allow_origin'),
'Access-Control-Allow-Methods' => $this->getConfig('allow_methods'),
'Access-Control-Allow-Headers' => $this->getConfig('allow_headers'),
];
}
/**
* @param $key
* @return mixed|null
*/
private function getConfig($key)
{
return $this->config[$key] ?? null;
}
}