From 7ad1c44cf4a55ee716f60ed6c291731d851b30bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Deruss=C3=A9?= Date: Tue, 15 Jun 2021 16:01:15 +0200 Subject: [PATCH] Fix RequestContext not updated --- .../Middleware/RouterContextMiddleware.php | 42 +++++++++++++------ .../RouterContextMiddlewareTest.php | 35 +++++++++------- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/src/Symfony/Component/Messenger/Middleware/RouterContextMiddleware.php b/src/Symfony/Component/Messenger/Middleware/RouterContextMiddleware.php index 35a381870b858..62bd1d7e5b8d2 100644 --- a/src/Symfony/Component/Messenger/Middleware/RouterContextMiddleware.php +++ b/src/Symfony/Component/Messenger/Middleware/RouterContextMiddleware.php @@ -14,7 +14,6 @@ use Symfony\Component\Messenger\Envelope; use Symfony\Component\Messenger\Stamp\ConsumedByWorkerStamp; use Symfony\Component\Messenger\Stamp\RouterContextStamp; -use Symfony\Component\Routing\RequestContext; use Symfony\Component\Routing\RequestContextAwareInterface; /** @@ -49,24 +48,41 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope return $stack->next()->handle($envelope, $stack); } - $currentContext = $this->router->getContext(); + $context = $this->router->getContext(); + $currentBaseUrl = $context->getBaseUrl(); + $currentMethod = $context->getMethod(); + $currentHost = $context->getHost(); + $currentScheme = $context->getScheme(); + $currentHttpPort = $context->getHttpPort(); + $currentHttpsPort = $context->getHttpsPort(); + $currentPathInfo = $context->getPathInfo(); + $currentQueryString = $context->getQueryString(); /* @var RouterContextStamp $contextStamp */ - $this->router->setContext(new RequestContext( - $contextStamp->getBaseUrl(), - $contextStamp->getMethod(), - $contextStamp->getHost(), - $contextStamp->getScheme(), - $contextStamp->getHttpPort(), - $contextStamp->getHttpsPort(), - $contextStamp->getPathInfo(), - $contextStamp->getQueryString() - )); + $context + ->setBaseUrl($contextStamp->getBaseUrl()) + ->setMethod($contextStamp->getMethod()) + ->setHost($contextStamp->getHost()) + ->setScheme($contextStamp->getScheme()) + ->setHttpPort($contextStamp->getHttpPort()) + ->setHttpsPort($contextStamp->getHttpsPort()) + ->setPathInfo($contextStamp->getPathInfo()) + ->setQueryString($contextStamp->getQueryString()) + ; try { return $stack->next()->handle($envelope, $stack); } finally { - $this->router->setContext($currentContext); + $context + ->setBaseUrl($currentBaseUrl) + ->setMethod($currentMethod) + ->setHost($currentHost) + ->setScheme($currentScheme) + ->setHttpPort($currentHttpPort) + ->setHttpsPort($currentHttpsPort) + ->setPathInfo($currentPathInfo) + ->setQueryString($currentQueryString) + ; } } } diff --git a/src/Symfony/Component/Messenger/Tests/Middleware/RouterContextMiddlewareTest.php b/src/Symfony/Component/Messenger/Tests/Middleware/RouterContextMiddlewareTest.php index a183cd03fb6ab..bddf56f65f40e 100644 --- a/src/Symfony/Component/Messenger/Tests/Middleware/RouterContextMiddlewareTest.php +++ b/src/Symfony/Component/Messenger/Tests/Middleware/RouterContextMiddlewareTest.php @@ -3,7 +3,10 @@ namespace Symfony\Component\Messenger\Tests\Middleware; use Symfony\Component\Messenger\Envelope; +use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\RouterContextMiddleware; +use Symfony\Component\Messenger\Middleware\StackInterface; +use Symfony\Component\Messenger\Middleware\StackMiddleware; use Symfony\Component\Messenger\Stamp\ConsumedByWorkerStamp; use Symfony\Component\Messenger\Stamp\RouterContextStamp; use Symfony\Component\Messenger\Test\Middleware\MiddlewareTestCase; @@ -34,30 +37,32 @@ public function testMiddlewareStoreContext() public function testMiddlewareRestoreContext() { $router = $this->createMock(RequestContextAwareInterface::class); - $originalContext = new RequestContext(); + $context = new RequestContext('', 'POST', 'github.com'); $router ->expects($this->once()) ->method('getContext') - ->willReturn($originalContext); - - $router - ->expects($this->exactly(2)) - ->method('setContext') - ->withConsecutive( - [$this->callback(function ($context) { - $this->assertSame('symfony.com', $context->getHost()); - - return true; - })], - [$originalContext] - ); + ->willReturn($context); $middleware = new RouterContextMiddleware($router); $envelope = new Envelope(new \stdClass(), [ new ConsumedByWorkerStamp(), new RouterContextStamp('', 'GET', 'symfony.com', 'https', 80, 443, '/', ''), ]); - $middleware->handle($envelope, $this->getStackMock()); + + $nextMiddleware = $this->createMock(MiddlewareInterface::class); + $nextMiddleware + ->expects($this->once()) + ->method('handle') + ->willReturnCallback(function (Envelope $envelope, StackInterface $stack) use ($context): Envelope { + $this->assertSame('symfony.com', $context->getHost()); + + return $envelope; + }) + ; + + $middleware->handle($envelope, new StackMiddleware($nextMiddleware)); + + $this->assertSame('github.com', $context->getHost()); } }