WebSocket (Sockjs и Stomp) с ServiceWorkers

Я использую Stomp и Sockjs для регистрации веб-сокета на моем автономном сервере Spring Boot (3.1.1), и все работает нормально. Однако я реализовал ServiceWorker для обработки автономных служб, и все они работают, кроме сокета. Вызов ws: // localhost / registerSocket приводит к этой ошибке во внешнем интерфейсе:

Firefox не может установить соединение с сервером по адресу ws: // localhost / registerSocket / 351 / 4vevdv79 / websocket.

И это на бэкэнде:

ОШИБКА o.s.w.s.s.s.DefaultHandshakeHandler - Не удалось выполнить рукопожатие из-за недопустимого заголовка обновления: null

В моем ServiceWorker я специально исключил его из перехвата запроса ws:

if (uri.indexOf("/registerSocket") === -1) {
   event.respondWith(getResponse(event));
}

Тем не менее, обновление ws неизбежно терпит неудачу, и он возвращается к полифиллу старого стиля кометы.

Кто-нибудь знает, как заставить веб-сокеты правильно работать с ServiceWorker?


person tanenbring    schedule 25.01.2016    source источник
comment
Я не уверен, что соединения с веб-сокетами перехватываются работниками службы, я думаю, что это не так. Однако в вашем фрагменте есть ошибка, event.responseWith должно быть event.respondWith. Не могли бы вы попробовать добавить запись в журнал для события «выборка» и посмотреть, срабатывает ли оно при открытии веб-сокета?   -  person Marco Castelluccio    schedule 26.01.2016
comment
Да, это так. Я много писал об этом. Я не уверен, что он должен их перехватывать. Согласно некоторым веб-сайтам, он должен только перехватывать HTTP-запросы. Может, это просто ошибка в реализации браузеров?   -  person tanenbring    schedule 26.01.2016
comment
Я так не думаю, не могли бы вы поделиться своим исходным кодом?   -  person Marco Castelluccio    schedule 27.01.2016


Ответы (2)


Я только что узнал об ошибке в Firefox 44, из-за которой соединения через веб-сокеты не работали при использовании Service Worker.

См. этот отчет об ошибке.

Ошибка должна быть исправлена ​​сейчас (начиная с Firefox 44.0.1; она даже в примечания к выпуску).

person Marco Castelluccio    schedule 31.03.2017

fetch обработчики событий в сервис-воркере запускаются только в ответ на HTTP-запросы. Запросы на открытие WebSocket или передачу данных через этот WebSocket не запускают fetch обработчик событий, а это означает, что работник службы не будет участвовать.

person Jeff Posnick    schedule 27.01.2016
comment
Спасибо. Предполагается ли, что вы используете будущее время, чтобы показать, что реализации браузеров могут еще не соответствовать спецификации? - person tanenbring; 27.01.2016
comment
Нет, я не собирался подразумевать будущее время. Я отредактирую свой ответ, чтобы уточнить. - person Jeff Posnick; 27.01.2016
comment
Ах хорошо. Спасибо за разъяснение. Тем не мение. Факт остается фактом: когда я не включаю сервис-воркера и отменяю его регистрацию в about: serviceworkers, обновление ws проходит нормально. Когда я включаю сервис-воркер, он терпит неудачу. Единственное, что я меняю, это вызов navigator.serviceWorker.register('/service-worker.js'). - person tanenbring; 28.01.2016