socket.io-client connect_timeout при подключении к websocket, но wscat работает - PullRequest
0 голосов
/ 05 августа 2020

У меня проблемы с подключением к моему серверу, на котором запущен flask -socketio с использованием библиотеки socket.io-client.

Соединение с длинным опросом работает правильно, но не может перейти на веб-сокеты. По этой причине я отключил опрос в качестве транспортного протокола и оставил только ['websocket'].

В моем сценарии я сначала выполняю вызов HTTPS на конечную точку, отличную от ws, которая правильно обрабатывается flask server.

Затем я пытаюсь подключиться к websocket с помощью socket.io-client.

Сетевой журнал в средствах отладки показывает, что был запрос к wss://mysite.com/socket.io/?EIO=3&transport=websocket со статусом 101 код, но время ожидания соединения истекает через 20 секунд (получено событие connect_timeout).

Однако, когда я скопировал запрос из сетевого журнала «как cURL» и передал его параметры * в wscat , соединение было успешно установлено через долю секунды, и я получил данные, отправленные клиенту.

* Мне пришлось немного изменить эти параметры:

  1. Удалить параметр --compressed, не поддерживаемый инструментом.
  2. Мне пришлось удалить заголовок Sec-WebSocket-Key, так как я сообщил об ошибке Invalid Sec-WebSocket-Accept header. Возможно, это из-за ошибки wscat, я проверил хэши из заголовков ответов вручную (хотя я использовал те, которые были видны в браузере), и они были правильными, более того, ни Firefox, ни Chrome сообщил об аналогичных проблемах.
  3. Мне пришлось удалить заголовок Origin, потому что по неизвестной причине соединение было немедленно прервано с ошибкой 1005.

Я выполняю предварительное формирование обоих этих соединений на той же машине. Когда я запускал сервер flask (поверх gevent-websocket) локально, проблем с установкой соединения с веб-сокетом не было.

Проблемы возникают тогда, когда сервер работает в AWS облаке . Я установил Application Load Balancer, который перенаправляет трафик HTTPS c в экземпляр EC2, где nginx перенаправляет трафик c на сервер flask -socketio, работающий поверх gevent-websocket.

HTTPS-запросы маршрутизируются правильно из браузера и из командной строки, но wss-соединение не может быть установлено из браузера (ни Firefox, ни Chrome), только из командной строки.

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

Я попытался исключить nginx из уравнения, перенаправляющего трафик c напрямую из балансировщика нагрузки на порт сервера, но это не помогло.

wss://mysite.com/socket.io/?EIO=3&transport=websocket запрос, сделанный браузером, появляется в журнале nginx, но сервер flask не получает событие 'connect', как и ' сторона socket.io-client.

...