Skip to content

Instantly share code, notes, and snippets.

@rodrigodiez
Last active February 7, 2018 11:11
Show Gist options
  • Save rodrigodiez/a7d606907d65da90fed25b6f6980c4c7 to your computer and use it in GitHub Desktop.
Save rodrigodiez/a7d606907d65da90fed25b6f6980c4c7 to your computer and use it in GitHub Desktop.
<?php
namespace App\Logger\Processor;
use Symfony\Component\HttpFoundation\RequestStack;
class RequestIdProcessor
{
private $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public function processRecord($record)
{
$request = $this->requestStack->getCurrentRequest();
if($request !== null) {
$requestId = $request->headers->get('X-Request-ID');
if ($requestId !== null) {
$record['extra']['x_request_id'] = $requestId;
}
}
return $record;
}
}
<?php
namespace spec\App\Logger\Processor;
use App\Logger\Processor\RequestIdProcessor;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\HeaderBag;
class RequestIdProcessorSpec extends ObjectBehavior
{
public function let(RequestStack $requestStack, Request $request, HeaderBag $headers)
{
$request->headers = $headers;
$requestStack->getCurrentRequest()->willReturn($request);
$this->beConstructedWith($requestStack);
}
function it_is_initializable()
{
$this->shouldHaveType(RequestIdProcessor::class);
}
function it_adds_x_request_id_header_as_an_extra_field(RequestStack $requestStack, HeaderBag $headers, Request $request)
{
$headers->get('X-Request-ID')->shouldBeCalled()->willReturn('foo');
$requestStack->getCurrentRequest()->shouldBeCalled()->willReturn($request);
$this->processRecord(['extra' => []])->shouldBe(['extra' => ['x_request_id' => 'foo']]);
}
function it_does_not_add_the_extra_field_if_header_is_not_set(HeaderBag $headers)
{
$headers->get('X-Request-ID')->willReturn(null);
$this->processRecord(['extra' => []])->shouldBe(['extra' => []]);
}
function it_does_not_add_the_extra_field_if_not_in_requestcontext(RequestStack $requestStack)
{
$requestStack->getCurrentRequest()->willReturn(null);
$this->processRecord(['extra' => []])->shouldBe(['extra' => []]);
}
}
<?php
namespace App\EventListener;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Psr\Log\LoggerInterface;
class RequestIdResponseListener
{
private const LOG_NO_HEADER = 'No X-Request-ID header was found in the request. Response won\'t have it';
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function onKernelResponse(FilterResponseEvent $event)
{
$request = $event->getRequest();
$response = $event->getResponse();
$header = $request->headers->get('X-Request-ID');
if($header === null) {
$this->logger->warning(self::LOG_NO_HEADER);
return;
}
$response->headers->set('X-Request-ID', $request->headers->get('X-Request-ID'));
}
}
<?php
namespace spec\App\EventListener;
use App\EventListener\RequestIdResponseListener;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\HeaderBag;
use Psr\Log\LoggerInterface;
class RequestIdResponseListenerSpec extends ObjectBehavior
{
public function let(FilterResponseEvent $event, Request $request, Response $response, HeaderBag $requestHeaders, HeaderBag $responseHeaders, LoggerInterface $logger)
{
$request->headers = $requestHeaders;
$response->headers = $responseHeaders;
$event->getRequest()->willReturn($request);
$event->getResponse()->willReturn($response);
$this->beConstructedWith($logger);
}
function it_is_initializable()
{
$this->shouldHaveType(RequestIdResponseListener::class);
}
function it_adds_x_request_id_header_in_the_response(FilterResponseEvent $event, Request $request, Response $response, HeaderBag $requestHeaders, HeaderBag $responseHeaders)
{
$event->getRequest()->shouldBeCalled()->willReturn($request);
$requestHeaders->get('X-Request-ID')->shouldBeCalled()->willReturn('foo');
$event->getResponse()->shouldBeCalled()->willReturn($response);
$responseHeaders->set('X-Request-ID', 'foo')->shouldBeCalled();
$this->onKernelResponse($event);
}
function it_does_not_add_header_if_not_present_in_request(FilterResponseEvent $event, Request $request, Response $response, HeaderBag $requestHeaders, HeaderBag $responseHeaders, LoggerInterface $logger)
{
$requestHeaders->get('X-Request-ID')->willReturn(null);
$responseHeaders->set('X-Request-ID', Argument::any())->shouldNotBeCalled();
$logger->warning('No X-Request-ID header was found in the request. Response won\'t have it')->shouldBeCalled();
$this->onKernelResponse($event);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment