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 является мусором, собранным, пока его соединение все еще открыто, агент пользователя должен завершить запрос.
проверьте, какое состояние, флаг send () и прослушиватели событий установлены, пока данные не отправляются.