SSE Laravel: у ответа EventSource есть тип MIME («text / html»), который не является «text / event-stream».Прерывание соединения - PullRequest
3 голосов
/ 08 апреля 2019

В локальных системах разработки таких ошибок не возникало, но при развертывании на работающем производственном сервере я получаю следующие ошибки.

Ответ EventSource имеет тип MIME ("text / html"), который не является "text / event-stream". Прерывание соединения.

Я использую Laravel. Я установил заголовки в функции контроллера следующим образом. Я обнаружил, что многие люди сталкиваются с одними и теми же проблемами в разных фреймворках, но не могут найти рабочее решение для меня.

Может ли кто-нибудь иметь решение или предложение по этому поводу? Заранее спасибо.

Ниже приведен JavaScript-вызов SSE.

<script>
if(typeof(EventSource) !== "undefined"){
    var source = new EventSource("/sse");
    source.addEventListener("response", function(event) {
         document.getElementById("result").innerHTML += "<p>RESPONSE DATA</p><p>" + event.data + "</p>";
    });
} else {
    document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events.";
} 

Ниже приводится функция контроллера Laravel. Я также попытался установить заголовки в public function __construct () {} , а также попытался установить в public function index () {} Это тоже не помогло.

public function sse($userid,Request $request){
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');

    $SERVER = env('SERVER','');
    $url    = $SERVER.'/stream';
    $user   = Auth::user();
    $gwuser = $user->gwuser;
    $gwpass = $user->gwpass;


    ini_set('output_buffering', 'off');
    ini_set('zlib.output_compression',false);
    ini_set('implicit_flush',true);

    while (@ob_end_flush()){
    ob_implicit_flush(true);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_USERPWD, $gwuser . ':' . $gwpass);

        $error  = 0;

        //$result = curl_exec($ch);
        //This while loop is only for server timeout after 5 minutes
        while(true){
            $result = curl_exec($ch);
        }


    }

}

Я также пытался использовать Middleware для установки заголовков для выбранного маршрута и вызова связующего ПО для этого маршрута. Это не помогло.

namespace App\Http\Middleware;
use Closure;

class setHeader
{
public function handle($request, Closure $next)
{
    $response = $next($request);
    $response->header('Content-Type', 'text/event-stream');
    $response->header('Cache-Control', 'no-cache');
    return $response;

}

}
...