Skip to content

"Cannot modify header information" error encountered while streaming #60603

@sarukomine

Description

@sarukomine

Symfony version(s) affected

7.3.0

Description

Hi, I'm trying to use Livewire streams in my Laravel app, but it keep on triggering "Cannot modify header information" error such as livewire/livewire#9357

After digging deeper into the codes, I found this PR #60377 that triggered above issue.

How to reproduce

You could check out my repo below. I installed a fresh new Laravel app with just Livewire installed to make sure nothing else was affecting the test results.

  1. Execute below commands
git clone git@github.com:sarukomine/livewire-stream-for-report.git

cd livewire-stream-for-report

git checkout 12.x

composer install

cp .env.example .env

php artisan key:generate

php artisan migrate

php artisan serve
  1. Open http://127.0.0.1:8000/stream page

  2. Click "Start count-down" button

  3. Open storage/logs/laravel.log file, you could see the error message

livewire-stream (10.x)

laravel/laravel => v10.3.3
laravel/framework => v10.48.29
livewire/livewire => v3.6.3
symfony/http-foundation => v6.4.22

livewire-stream (11.x)

laravel/laravel => v11.6.1
laravel/framework => v11.0.0
livewire/livewire => v3.6.3
symfony/http-foundation => v7.3.0

livewire-stream (12.x)

laravel/laravel => v12.0.9
laravel/framework => v12.16.0
livewire/livewire => v3.6.3
symfony/http-foundation => v7.3.0

Possible Solution

Just add the fix before trigger header() method, stream response will be works fine.

if (!empty(preg_grep('/^Content-Type:.*\btext\/event-stream\b.*/i', headers_list()))) {
    return $this;
}

like that

// headers have already been sent by the developer
if (headers_sent()) {
    // Add a fix here
    if (!empty(preg_grep('/^Content-Type:.*\btext\/event-stream\b.*/i', headers_list()))) {
        return $this;
    }

    if (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
        // Or add a fix here
        if (!empty(preg_grep('/^Content-Type:.*\btext\/event-stream\b.*/i', headers_list()))) {
            return $this;
        }

        $statusCode ??= $this->statusCode;
        header(\sprintf('HTTP/%s %s %s', $this->version, $statusCode, $this->statusText), true, $statusCode);
    }

    return $this;
}

Or, we may delete these changes from #60377, let this function keep simple~

Additional Context

[2025-05-30 13:11:31] local.ERROR: Cannot modify header information - headers already sent by (output started at /Users/whoami/Herd/livewire-stream-11/vendor/livewire/livewire/src/Features/SupportStreaming/SupportStreaming.php:37) {"exception":"[object] (ErrorException(code: 0): Cannot modify header information - headers already sent by (output started at /Users/whoami/Herd/livewire-stream-11/vendor/livewire/livewire/src/Features/SupportStreaming/SupportStreaming.php:37) at /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php:322)
[stacktrace]
#0 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(256): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'Cannot modify h...', '/Users/whoami...', 322)
#1 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->Illuminate\\Foundation\\Bootstrap\\{closure}(2, 'Cannot modify h...', '/Users/whoami...', 322)
#2 /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php(322): header('HTTP/1.1 200 OK', true, 200)
#3 /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php(401): Symfony\\Component\\HttpFoundation\\Response->sendHeaders()
#4 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1168): Symfony\\Component\\HttpFoundation\\Response->send()
#5 /Users/whoami/Herd/livewire-stream-11/public/index.php(17): Illuminate\\Foundation\\Application->handleRequest(Object(Illuminate\\Http\\Request))
#6 /Applications/Herd.app/Contents/Resources/valet/server.php(167): require('/Users/whoami...')
#7 {main}
"}
[2025-05-30 13:11:31] local.ERROR: Uncaught ErrorException: Cannot modify header information - headers already sent by (output started at /Users/whoami/Herd/livewire-stream-11/vendor/livewire/livewire/src/Features/SupportStreaming/SupportStreaming.php:37) in /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php:322
Stack trace:
#0 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(256): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'Cannot modify h...', '/Users/whoami...', 322)
#1 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(2, 'Cannot modify h...', '/Users/whoami...', 322)
#2 /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php(322): header('HTTP/1.1 500 In...', true, 500)
#3 /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php(401): Symfony\Component\HttpFoundation\Response->sendHeaders()
#4 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(219): Symfony\Component\HttpFoundation\Response->send()
#5 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(196): Illuminate\Foundation\Bootstrap\HandleExceptions->renderHttpResponse(Object(ErrorException))
#6 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(256): Illuminate\Foundation\Bootstrap\HandleExceptions->handleException(Object(ErrorException))
#7 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->Illuminate\Foundation\Bootstrap\{closure}(Object(ErrorException))
#8 {main}
  thrown {"exception":"[object] (Symfony\\Component\\ErrorHandler\\Error\\FatalError(code: 0): Uncaught ErrorException: Cannot modify header information - headers already sent by (output started at /Users/whoami/Herd/livewire-stream-11/vendor/livewire/livewire/src/Features/SupportStreaming/SupportStreaming.php:37) in /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php:322
Stack trace:
#0 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(256): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleError(2, 'Cannot modify h...', '/Users/whoami...', 322)
#1 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->Illuminate\\Foundation\\Bootstrap\\{closure}(2, 'Cannot modify h...', '/Users/whoami...', 322)
#2 /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php(322): header('HTTP/1.1 500 In...', true, 500)
#3 /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php(401): Symfony\\Component\\HttpFoundation\\Response->sendHeaders()
#4 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(219): Symfony\\Component\\HttpFoundation\\Response->send()
#5 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(196): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->renderHttpResponse(Object(ErrorException))
#6 /Users/whoami/Herd/livewire-stream-11/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/HandleExceptions.php(256): Illuminate\\Foundation\\Bootstrap\\HandleExceptions->handleException(Object(ErrorException))
#7 [internal function]: Illuminate\\Foundation\\Bootstrap\\HandleExceptions->Illuminate\\Foundation\\Bootstrap\\{closure}(Object(ErrorException))
#8 {main}
  thrown at /Users/whoami/Herd/livewire-stream-11/vendor/symfony/http-foundation/Response.php:322)
[stacktrace]
#0 {main}
"}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy