Last active
February 7, 2018 11:11
-
-
Save rodrigodiez/a7d606907d65da90fed25b6f6980c4c7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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' => []]); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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')); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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