У меня проблема с установлением соединения 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.
Это может быть 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.
Других решений пока нет …