<?php
namespace WebserviceBundle\Event;
use Predis\Client;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
/**
* Class IdempotencyRequestListener
* @package WebserviceBundle\Event
*/
class IdempotencyRequestListener
{
/**
* @var Client
*/
private $redisConnection;
/**
* IdempotencyRequestListener constructor.
* @param Client $redisConnection
*/
public function __construct(Client $redisConnection)
{
$this->redisConnection = $redisConnection;
}
/**
* @param GetResponseEvent $event
*/
public function onRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->headers->has('idempotency-key') || !$request->headers->get('idempotency-key')) {
return;
}
$requestKey = $request->headers->get('idempotency-key');
$prefix = 'IDEMP_';
$value = $prefix . $requestKey;
// return 304 (not-modified) when key already exists
if ($this->redisConnection->exists($value)) {
$event->setResponse(new Response('Non-unique request', 304));
}
$this->redisConnection->setex($value, 3600, 'exists');
}
}