<?php
namespace Can\RestBundle\EventListener;
use Can\RestBundle\CanRestBundle;
use Can\RestBundle\Http\Header\DoNotTrack;
use Can\RestBundle\Tracking\TrackingConfiguration;
use Can\RestBundle\Tracking\TrackingHeader;
use Can\RestBundle\Tracking\TrackingResolverInterface;
use Can\RestBundle\Tracking\TrackingUtil;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use InvalidArgumentException;
/**
* Manages tracking headers (DNT and its Do-Not-Track variants).
*
* @group tracking
*
* @package can/rest-bundle
* @author lechecacharro <lechecacharro@gmail.com>
*/
class TrackingListener
{
/**
* @var TrackingConfiguration
*/
private $configuration;
/**
* @var TrackingResolverInterface
*/
private $resolver;
/**
* TrackingListener constructor.
*
* @param TrackingConfiguration $configuration
* @param TrackingResolverInterface $resolver
*/
public function __construct(TrackingConfiguration $configuration, TrackingResolverInterface $resolver)
{
$this->configuration = $configuration;
$this->resolver = $resolver;
}
/**
* @param ResponseEvent $event
*/
public function onResponse(ResponseEvent $event): void
{
if (! $this->configuration->isEnabled()) {
return;
}
$request = $event->getRequest();
if (! $request->attributes->get(CanRestBundle::ATTR_SERVICE_ZONE)) {
return;
}
if (null === $doNotTrack = TrackingUtil::extractDoNotTrackHeader($request)) {
return;
}
try {
$trackingPreference = DoNotTrack::parseHeader($doNotTrack);
} catch (InvalidArgumentException $e) {
throw new BadRequestHttpException($e->getMessage(), $e);
}
$trackingStatus = $this->resolver->resolve($request);
$request->attributes->set(CanRestBundle::ATTR_DO_NOT_TRACK, (string) $doNotTrack);
$request->attributes->set(CanRestBundle::ATTR_TRACKING_PREFERENCE, $trackingPreference);
$request->attributes->set(CanRestBundle::ATTR_TRACKING_STATUS, $trackingStatus);
$response = $event->getResponse();
$response->headers->set(TrackingHeader::TRACKING_STATUS, $trackingStatus->getValue());
}
}