diff --git a/UPGRADE-6.1.md b/UPGRADE-6.1.md index 333731b4e1f83..0029ea9fcc833 100644 --- a/UPGRADE-6.1.md +++ b/UPGRADE-6.1.md @@ -27,11 +27,6 @@ FrameworkBundle To prevent services resetting after each message the "--no-reset" option in "messenger:consume" command can be set * Deprecate not setting the `http_method_override` config option. The default value will change to `false` in 7.0. -HttpKernel ----------- - - * Deprecate StreamedResponseListener, it's not needed anymore - Routing ------- diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.php b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.php index a3a6ef7735612..7725b7509c05b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.php +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/web.php @@ -31,6 +31,7 @@ use Symfony\Component\HttpKernel\EventListener\ErrorListener; use Symfony\Component\HttpKernel\EventListener\LocaleListener; use Symfony\Component\HttpKernel\EventListener\ResponseListener; +use Symfony\Component\HttpKernel\EventListener\StreamedResponseListener; use Symfony\Component\HttpKernel\EventListener\ValidateRequestListener; return static function (ContainerConfigurator $container) { @@ -104,6 +105,9 @@ ]) ->tag('kernel.event_subscriber') + ->set('streamed_response_listener', StreamedResponseListener::class) + ->tag('kernel.event_subscriber') + ->set('locale_listener', LocaleListener::class) ->args([ service('request_stack'), diff --git a/src/Symfony/Component/HttpKernel/CHANGELOG.md b/src/Symfony/Component/HttpKernel/CHANGELOG.md index 8aceb90c862f7..021fe312b51a8 100644 --- a/src/Symfony/Component/HttpKernel/CHANGELOG.md +++ b/src/Symfony/Component/HttpKernel/CHANGELOG.md @@ -32,7 +32,6 @@ CHANGELOG * Add `BackedEnumValueResolver` to resolve backed enum cases from request attributes in controller arguments * Add `DateTimeValueResolver` to resolve request attributes into DateTime objects in controller arguments - * Deprecate StreamedResponseListener, it's not needed anymore * Add `Profiler::isEnabled()` so collaborating collector services may elect to omit themselves * Add the `UidValueResolver` argument value resolver * Add `AbstractBundle` class for DI configuration/definition on a single file diff --git a/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php b/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php index ec27eaec122e5..4cdef3e0624d7 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/AbstractSessionListener.php @@ -257,7 +257,7 @@ public static function getSubscribedEvents(): array { return [ KernelEvents::REQUEST => ['onKernelRequest', 128], - // low priority to come after regular response listeners + // low priority to come after regular response listeners, but higher than StreamedResponseListener KernelEvents::RESPONSE => ['onKernelResponse', -1000], ]; } diff --git a/src/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php b/src/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php index 312d5ee23b68e..1a61188f433d2 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/StreamedResponseListener.php @@ -16,8 +16,6 @@ use Symfony\Component\HttpKernel\Event\ResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; -trigger_deprecation('symfony/http-kernel', '6.1', 'The "%s" class is deprecated.', StreamedResponseListener::class); - /** * StreamedResponseListener is responsible for sending the Response * to the client. @@ -25,8 +23,6 @@ * @author Fabien Potencier * * @final - * - * @deprecated since Symfony 6.1 */ class StreamedResponseListener implements EventSubscriberInterface { diff --git a/src/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php b/src/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php index a5a240a6265ec..10fe698ac1a40 100644 --- a/src/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/HttpKernelTest.php @@ -18,6 +18,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface; use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; use Symfony\Component\HttpKernel\Event\ExceptionEvent; @@ -477,6 +478,34 @@ public function testInconsistentClientIpsOnMainRequests() Request::setTrustedProxies([], -1); } + public function testVerifyRequestStackPushPopCallOrderDuringHandle() + { + $request = new Request(); + $stack = new RequestStack(); + $dispatcher = new EventDispatcher(); + $kernel = $this->getHttpKernel($dispatcher, null, $stack); + + $response = $kernel->handle($request, HttpKernelInterface::MAIN_REQUEST); + self::assertNull($stack->getMainRequest()); + $response->send(); + self::assertNull($stack->getMainRequest()); + } + + public function testVerifyRequestStackPushPopWithStreamedResponse() + { + $request = new Request(); + $stack = new RequestStack(); + $dispatcher = new EventDispatcher(); + $kernel = $this->getHttpKernel($dispatcher, [new TestController(), 'streamedResponseController'], $stack); + + $response = $kernel->handle($request, HttpKernelInterface::MAIN_REQUEST); + self::assertNotNull($stack->getMainRequest()); + ob_start(); + $response->send(); + self::assertSame('foo', ob_get_clean()); + self::assertNull($stack->getMainRequest()); + } + private function getHttpKernel(EventDispatcherInterface $eventDispatcher, $controller = null, RequestStack $requestStack = null, array $arguments = [], bool $handleAllThrowables = false) { $controller ??= fn () => new Response('Hello'); @@ -515,6 +544,13 @@ public function controller() return new Response('foo'); } + public function streamedResponseController() + { + return new StreamedResponse(function () { + echo 'foo'; + }); + } + public static function staticController() { return new Response('foo');