diff --git a/src/LiveComponent/src/EventListener/LiveComponentSubscriber.php b/src/LiveComponent/src/EventListener/LiveComponentSubscriber.php index 5e545ad9719..3645bea60f3 100644 --- a/src/LiveComponent/src/EventListener/LiveComponentSubscriber.php +++ b/src/LiveComponent/src/EventListener/LiveComponentSubscriber.php @@ -282,6 +282,10 @@ public function onKernelResponse(ResponseEvent $event): void $request = $event->getRequest(); $response = $event->getResponse(); + if (!$event->isMainRequest()) { + return; + } + if (!$this->isLiveComponentRequest($request)) { return; } diff --git a/src/LiveComponent/tests/Functional/Controller/BatchActionControllerTest.php b/src/LiveComponent/tests/Functional/Controller/BatchActionControllerTest.php index 10bece17ed6..660c1059388 100644 --- a/src/LiveComponent/tests/Functional/Controller/BatchActionControllerTest.php +++ b/src/LiveComponent/tests/Functional/Controller/BatchActionControllerTest.php @@ -154,6 +154,40 @@ public function testRedirect(): void ; } + public function testRedirectWithAcceptHeader(): void + { + $dehydrated = $this->dehydrateComponent($this->mountComponent('with_actions')); + + $this->browser() + ->throwExceptions() + ->get('/_components/with_actions', ['query' => ['props' => json_encode($dehydrated->getProps())]]) + ->assertSuccessful() + ->interceptRedirects() + ->use(function (Crawler $crawler, KernelBrowser $browser) { + $rootElement = $crawler->filter('ul')->first(); + $liveProps = json_decode($rootElement->attr('data-live-props-value'), true); + + $browser->post('/_components/with_actions/_batch', [ + 'body' => [ + 'data' => json_encode([ + 'props' => $liveProps, + 'actions' => [ + ['name' => 'redirect'], + ['name' => 'exception'], + ], + ]), + ], + 'headers' => [ + 'Accept' => ['application/vnd.live-component+html'], + 'X-CSRF-TOKEN' => $crawler->filter('ul')->first()->attr('data-live-csrf-value'), + ], + ]); + }) + ->assertStatus(204) + ->assertHeaderContains('X-Live-Redirect', '1') + ; + } + public function testException(): void { $dehydrated = $this->dehydrateComponent($this->mountComponent('with_actions'));