swoft-cloud / swoft-component

📦 This is a repository of centralized management of all swoft core components
https://www.swoft.org
Apache License 2.0
97 stars 107 forks source link

fix:Swoole\Http\Response::header(): http context is unavailable #546

Closed aslackers closed 4 years ago

aslackers commented 4 years ago

This is a bug in HttpDispatcher::dispatch():

       // Trigger after request
        Swoft::trigger(HttpServerEvent::AFTER_REQUEST, null, $response);

        // After request
        $this->afterRequest($response);

what afterRequest did AFTER_REQUEST event already did, especially $response->send(). so, it will have follow error:

swoft-srv | Fatal error: Uncaught ErrorException: Swoole\Http\Response::header(): http context is unavailable (maybe it has been ended or detached) in /var/www/swoft/vendor/swoft/http-message/src/Response.php:209
swoft-srv | Stack trace:
swoft-srv | #0 [internal function]: Swoft\Error\DefaultErrorDispatcher->handleError(2, 'Swoole\\Http\\Res...', '/var/www/swoft/...', 209, Array)
swoft-srv | #1 /var/www/swoft/vendor/swoft/http-message/src/Response.php(209): Swoole\Http\Response->header('content-type', 'application/jso...', false)
swoft-srv | #2 /var/www/swoft/vendor/swoft/http-message/src/Response.php(189): Swoft\Http\Message\Response->quickSend(Object(Swoft\Http\Message\Response))
swoft-srv | #3 /var/www/swoft/vendor/swoft/http-server/src/HttpDispatcher.php(137): Swoft\Http\Message\Response->send()
swoft-srv | #4 /var/www/swoft/vendor/swoft/http-server/src/HttpDispatcher.php(96): Swoft\Http\Server\HttpDispatcher->afterRequest(Object(Swoft\Http\Message\Response))
swoft-srv | #5 /var/www/swoft/vendor/swoft/http-server/src/Swoole/RequestListener.php(42): Swoft\Http\Server\HttpDispatcher->dispatch(Object(Swoft\Http\Mes in /var/www/swoft/vendor/swoft/http-message/src/Response.php on line 209
stelin commented 4 years ago

AFTER_REQUEST 这个框架事件已经删除了,所以必须有aftereRequest方法,你是怎么复现的。