<?php
namespace App\Handler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class HttpRefererHandler
{
public const HTTP_REFERER_SESSION_KEY = 'http-referer';
private RequestStack $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public function getHttpReferer(): ?string
{
return $this->getSession()->get(self::HTTP_REFERER_SESSION_KEY);
}
/**
* TODO: Pour que ce système fonctionne il est nécessaire de repasser sur tout les appels HTTP en JS pour ajouter
* l'option 'X-Requested-With': 'XMLHttpRequest' dans le header. Sinon ces appels sont considérés comme "normaux"
* et donc pris en compte par le traitement.
*/
public function setHttpReferer(Request $request): void
{
if ($request->isXmlHttpRequest() || preg_match('/_profiler/', $request->getRequestUri())) {
return;
}
$serverBag = $request->server;
$baseUrl = $serverBag->get('REQUEST_SCHEME').'://'.$serverBag->get('SERVER_NAME');
$baseUrlForRegex = str_replace('/', '\/', $baseUrl);
$httpReferer = $serverBag->get('HTTP_REFERER');
if (!preg_match('/^'.$baseUrlForRegex.'/', $httpReferer)
|| preg_match('/^'.$baseUrlForRegex.'\/connexion/', $httpReferer)
) {
$httpReferer = $baseUrl;
}
if ($httpReferer !== $this->getHttpReferer()) {
$this->getSession()->set(self::HTTP_REFERER_SESSION_KEY, $httpReferer);
}
}
private function getSession(): SessionInterface
{
return $this->requestStack->getSession();
}
}