QWebSocket не может обработать рукопожатие

У меня проблема с установлением соединения WebSocket с помощью QWebSocket, Я использую Qt 5.6 и его QWebSocket реализация. Я уверен, что сервер работает правильно и использует WS v13 протокол. Работает нормально со всеми браузерами. Когда я пытаюсь подключиться к серверу, QWebSocket испускает error а также stateChanged сигналы с этими сообщениями (я получаю их с помощью errorString() метод):

QWebSocketPrivate::processHandshake: Connection closed while reading header.
Invalid statusline in response: Upgrade: websocket
Invalid statusline in response: Connection: Upgrade
Invalid statusline in response: Sec-WebSocket-Accept: HLaITyncgax+CH7OUIXnsCfFDDY=
Invalid statusline in response: // there's a carriage return symbol

Хотя это говорит Connection closed while reading header, соединение на самом деле не закрыто (потому что сервер через некоторое время отправляет дополнительные пакеты через websocket). Я протестировал свое приложение на эхо-тесте websocket.org, и оно отлично работает! Но я вынюхивал пакеты с обеих попыток и не обнаружил никаких существенных различий.

Результат перехвата пакетов на сервере, к которому я пытаюсь подключиться:

GET / HTTP/1.1
Host: <hostname>:6670
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: WcIsYc1AZ6CKikXFwGXgMg==
Origin: http://<hostname>
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Connection: keep-alive, UpgradeHTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 7lfSGmSz/eW1mSzaMnuzOqg00w4=

Результат перехвата пакетов при соединении с echo.websocket.org:

GET / HTTP/1.1
Host: echo.websocket.org:80
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: MUAZoP0Ef4KSWkmtsB5YDw==
Origin: http://<hostname>
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Connection: keep-alive, UpgradeHTTP/1.1 101 Web Socket Protocol Handshake
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Access-Control-Allow-Origin: http://<hostname>
Connection: Upgrade
Date: Thu, 31 Mar 2016 12:05:49 GMT
Sec-WebSocket-Accept: c4yAe+A1VRuhF1LSC/TGgPoa8N4=
Server: Kaazing Gateway
Upgrade: websocket

<data exchange goes here normally>

Что я должен сделать, чтобы исследовать и решить проблему? У меня нет доступа к серверу.

Постскриптум Да я в курсе QTBUG-40878. Это влияет на Qt 5.3.1, но я использую 5.6.0, и это, очевидно, было исправлено в моей настройке Qt.

2

Решение

Это может быть QTBUG-51069 (это не тот, который вы упомянули):

Если между строкой состояния («HTTP / 1.1 101 Upgrading Protocol») и заголовками существует задержка, QWebSocketPrivate :: processHandshake ошибочно обнаруживает отключение сервера. Проблема в том, что условие разъединения проверяется с помощью функции QAbstractSocket :: atEnd, которая просто проверяет, доступны ли данные, а не фактическое состояние сокета. Это приводит к нескольким сигналам ошибки:

websocket error: QWebSocket::processHandshake: Connection closed while reading header.
websocket error: Invalid statusline in response: Date: Thu, 11 Feb 2016 20:07:37 GMT^M .
websocket error: Invalid statusline in response: Server: WSGIServer/0.1 Python/2.7.10^M .
websocket error: Invalid statusline in response: Upgrade: websocket^M .
websocket error: Invalid statusline in response: Connection: Upgrade^M .
websocket error: Invalid statusline in response: Sec-WebSocket-Accept: oQ+NK56UdGrsXFisB9chjE3SU+Y=^M .
websocket error: Invalid statusline in response: Sec-WebSocket-Version: 13^M .
websocket error: Invalid statusline in response: Content-Length: 0^M .
websocket error: Invalid statusline in response: ^M .

Исправление в Qt 5.6.2.

Для Qt 5.7, судя по совершать историю я считать это будет в 5.7.1.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]