Skip to content

Commit 3f61170

Browse files
krzycnicolas-grekas
authored andcommitted
[HttpKernel] Fix empty request stack when terminating with exception
1 parent d84ce93 commit 3f61170

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed

HttpKernel.php

+11-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,17 @@ public function terminateWithException(\Throwable $exception, Request $request =
112112
throw $exception;
113113
}
114114

115-
$response = $this->handleThrowable($exception, $request, self::MASTER_REQUEST);
115+
if ($pop = $request !== $this->requestStack->getMasterRequest()) {
116+
$this->requestStack->push($request);
117+
}
118+
119+
try {
120+
$response = $this->handleThrowable($exception, $request, self::MASTER_REQUEST);
121+
} finally {
122+
if ($pop) {
123+
$this->requestStack->pop();
124+
}
125+
}
116126

117127
$response->sendHeaders();
118128
$response->sendContent();

Tests/HttpKernelTest.php

+17
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Symfony\Component\HttpFoundation\Response;
2121
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
2222
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
23+
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
2324
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
2425
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
2526
use Symfony\Component\HttpKernel\Exception\ControllerDoesNotReturnResponseException;
@@ -340,6 +341,22 @@ public function testTerminate()
340341
$this->assertEquals($response, $capturedResponse);
341342
}
342343

344+
public function testTerminateWithException()
345+
{
346+
$dispatcher = new EventDispatcher();
347+
$requestStack = new RequestStack();
348+
$kernel = $this->getHttpKernel($dispatcher, null, $requestStack);
349+
350+
$dispatcher->addListener(KernelEvents::EXCEPTION, function (ExceptionEvent $event) use (&$capturedRequest, $requestStack) {
351+
$capturedRequest = $requestStack->getCurrentRequest();
352+
$event->setResponse(new Response());
353+
});
354+
355+
$kernel->terminateWithException(new \Exception('boo'), $request = Request::create('/'));
356+
$this->assertSame($request, $capturedRequest);
357+
$this->assertNull($requestStack->getCurrentRequest());
358+
}
359+
343360
public function testVerifyRequestStackPushPopDuringHandle()
344361
{
345362
$request = new Request();

0 commit comments

Comments
 (0)