diff --git a/swoole_coroutine.cc b/swoole_coroutine.cc index 422426a96dd..7bf43772ac5 100644 --- a/swoole_coroutine.cc +++ b/swoole_coroutine.cc @@ -525,11 +525,15 @@ void PHPCoroutine::on_close(void *arg) { } if (OG(handlers).elements) { + zend_bool no_headers = SG(request_info).no_headers; + /* Do not send headers by SAPI */ + SG(request_info).no_headers = 1; if (OG(active)) { php_output_end_all(); } php_output_deactivate(); php_output_activate(); + SG(request_info).no_headers = no_headers; } if (task->array_walk_fci) { efree(task->array_walk_fci); diff --git a/tests/swoole_http_server/headers_sent.phpt b/tests/swoole_http_server/headers_sent.phpt new file mode 100644 index 00000000000..ec994abcd36 --- /dev/null +++ b/tests/swoole_http_server/headers_sent.phpt @@ -0,0 +1,49 @@ +--TEST-- +swoole_http_server: headers sent (coroutine disabled) +--SKIPIF-- + +--FILE-- +parentFunc = function () use ($pm) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:{$pm->getFreePort()}/"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + echo curl_exec($ch); + echo curl_exec($ch); + curl_close($ch); + $pm->kill(); +}; + +$pm->childFunc = function () use ($pm) { + $http = new swoole_http_server('127.0.0.1', $pm->getFreePort()); + $http->set([ + 'worker_num' => 1, + 'enable_coroutine' => false, + 'log_file' => '/dev/null' + ]); + $http->on('workerStart', function () use ($pm) { + $pm->wakeup(); + }); + $http->on('request', function (swoole_http_request $request, swoole_http_response $response) { + ob_start(); + echo 'Test'; + $output = ob_get_clean(); + $response->write('buffered_output=' . $output . "\n"); + $response->write('headers_sent=' . (int)headers_sent() . "\n"); + $response->end(); + }); + $http->start(); +}; + +$pm->childFirst(); +$pm->run(); +?> +--EXPECT-- +buffered_output=Test +headers_sent=0 +buffered_output=Test +headers_sent=0 diff --git a/tests/swoole_http_server/headers_sent_coroutine.phpt b/tests/swoole_http_server/headers_sent_coroutine.phpt new file mode 100644 index 00000000000..8b5d84ea379 --- /dev/null +++ b/tests/swoole_http_server/headers_sent_coroutine.phpt @@ -0,0 +1,49 @@ +--TEST-- +swoole_http_server: headers sent (coroutine enabled) +--SKIPIF-- + +--FILE-- +parentFunc = function () use ($pm) { + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:{$pm->getFreePort()}/"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + echo curl_exec($ch); + echo curl_exec($ch); + curl_close($ch); + $pm->kill(); +}; + +$pm->childFunc = function () use ($pm) { + $http = new swoole_http_server('127.0.0.1', $pm->getFreePort()); + $http->set([ + 'worker_num' => 1, + 'enable_coroutine' => true, + 'log_file' => '/dev/null' + ]); + $http->on('workerStart', function () use ($pm) { + $pm->wakeup(); + }); + $http->on('request', function (swoole_http_request $request, swoole_http_response $response) { + ob_start(); + echo 'Test'; + $output = ob_get_clean(); + $response->write('buffered_output=' . $output . "\n"); + $response->write('headers_sent=' . (int)headers_sent() . "\n"); + $response->end(); + }); + $http->start(); +}; + +$pm->childFirst(); +$pm->run(); +?> +--EXPECT-- +buffered_output=Test +headers_sent=0 +buffered_output=Test +headers_sent=0