Обработка неудачных запросов на обновление веб-сокета в клиенте Javascript

Я хочу, чтобы клиентский процесс javascript получал код состояния HTTP, который сервер возвращает, когда клиент делает запрос на обновление веб-сокета, и этот запрос не выполняется.

Мой сервер возвращает HTTP 400, чтобы указать, что обновление веб-сокета не выполнено.

Я использую Google Chrome, и когда я открываю консоль разработчика, я вижу следующее сообщение:

Соединение WebSocket с 'wss: //' не удалось: ошибка во время рукопожатия WebSocket: неожиданный код ответа: 400

Однако обработчик ошибки onerror не содержит этого сообщения, он получает ошибку 1006, но не указывает, что закрытие произошло в результате получения HTTP 400.

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

Я поместил ошибку веб-сокета ниже, она, похоже, не содержит ничего, что я мог бы использовать, чтобы указать, что эта ошибка является результатом ошибки рукопожатия веб-сокета.

 Websocket Error: {"path":{"length":0},"cancelBubble":false,"returnValue":true,"srcElement":{"binaryType":"blob","protocol":"","extensions":"","bufferedAmount":0,"readyState":3,"url":"wss://<my address>","URL":"wss://<my address>"},"defaultPrevented":false,"timeStamp":1417828938039,"cancelable":false,"bubbles":false,"eventPhase":2,"currentTarget":{"binaryType":"blob","protocol":"","extensions":"","bufferedAmount":0,"readyState":3,"url":"wss://<my address>","URL":"wss://<my address>"},"target":{"binaryType":"blob","protocol":"","extensions":"","bufferedAmount":0,"readyState":3,"url":"wss://<my address>","URL":"wss://<my address>"},"type":"error"}

person Benjamin Weber    schedule 06.12.2014    source источник


Ответы (1)


Боюсь, что с помощью Javascript невозможно узнать код состояния HTTP переговоров.

Определены коды закрытия, а 1006 означает только то, что соединение закрыто. резко, но протокол позволяет даже закрыть соединение без указания причины. Это вместе с readyState API является единственным инструменты вы должны диагностировать причину проблемы.

person vtortola    schedule 06.12.2014
comment
Да, похоже, невозможно определить, не удалось ли соединение WebSocket из-за неверных учетных данных аутентификации (то есть тех, которые переданы в качестве параметра запроса), или если соединение не удалось из-за сбоя сети или по любой другой причине. Из-за этого ограничения мне пришлось реализовать вторичное (настраиваемое) рукопожатие для аутентификации после установления соединения WebSocket (вместо использования стандартного квитирования WebSocket). Просто невозможно реализовать надежную аутентификацию без прозрачности состояний успеха / неудачи. - person Jon; 29.01.2016