Firefox случайным образом закрывает соединение XMLHttpRequest, если оно неактивно. Почему?

в классе JavaScript XMLHttpRequest подключается к серверу. Сервер медленно отправляет данные. Это отлично работает в Chromium, но Firefox закрывает соединение после случайного времени (между ~4s и ~70s).

почему Firefox закрывает соединение? и как этого избежать?

упрощенный код JS:

    var options = {};
    options['header']=
        { 'Cache-Control':'no-cache, max-age=0', 
            'Content-type': 'application/octet-stream',
            'Content-Disposition': 'inline'
        };

    // Get request information
    this.http = new XMLHttpRequest();
    this.http.onreadystatechange = _streamingResponse.bind(this);
    this.http.open('post', url, true);
    for (var i in options['header'])
    {
        this.http.setRequestHeader(i, options['header'][i]);
    }
    this.http.send('');

для части PHP, что-то вроде:

sleep(200); //wait long time, so firefox close the socket.

если сервер отправляет что-то каждые несколько секунд (

соединение близко с: - в свойстве readyState = 4 - статус = 0

сервер кажется правильным, так как в Chromium он работает правильно.

полный тестовый код:

2 ответов


после дальнейшего поиска я нашел ошибку в Mozilla, которая кажется ответственной за это поведение. Она должна быть решена в версии 45, но до тех пор мы должны вести с ним.

даже если ошибка связана только с Ipv6, у меня такая же проблема с использованием 127.0.0.1. Однако с Firefox Developer Edition (V 45) проблема, похоже, решена.

почему Firefox закрывает соединение?

не должно. ссылка: https://bugzilla.mozilla.org/show_bug.cgi?id=1240319

как ее решить?

за исключением отправки данных каждые 3-4 секунды для поддержания соединения открытым, я понятия не имею.


звучит ужасно похоже на сбор мусора.

Я вижу, вы пробовали тайм-аут. Но я не уверен, что понимаю ваш вывод:--3-->установка обратного вызова для таймаута, который он не запускает.

просто будьте абсолютно уверены, что вы следуете этим правилам:

4.2 устройства для сбора мусора

объект XMLHttpRequest не должен быть собранным мусором, если его состояние открыто с помощью набора флагов send (), заголовков received или загрузка,и зарегистрирован один или несколько прослушивателей событий, тип которых-readystatechange, progress, abort, error, load, timeout и loadend.

Если объект XMLHttpRequest является мусором, собранным, пока его соединение все еще открыто, агент пользователя должен завершить запрос.

xhr.spec.whatwg.org

проверьте, какое состояние, флаг send () и прослушиватели событий установлены, пока данные не отправляются.