From 56b3b6c14ef4153fb5d1173e29cd6093f61ffd8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Morten=20Johan=20S=C3=B8rvig?= Date: Fri, 22 Jun 2018 13:35:32 +0200 Subject: Forward Sec-WebSocket-Protocol header Forward the WebSocket protocol header value to the JavaScript WebSocket constructor. This is required for use-cases like MQTT. Change-Id: Ia58b5571661e83667c22bed57b0392bcef1eb67c Reviewed-by: Lorn Potter --- src/websockets/qwebsocket_wasm_p.cpp | 29 +++++++++++++++++++---------- src/websockets/qwebsocket_wasm_p.h | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/websockets/qwebsocket_wasm_p.cpp b/src/websockets/qwebsocket_wasm_p.cpp index db71cba..1c28a6e 100644 --- a/src/websockets/qwebsocket_wasm_p.cpp +++ b/src/websockets/qwebsocket_wasm_p.cpp @@ -410,32 +410,40 @@ void QWebSocketPrivate::open(const QNetworkRequest &request, bool mask) Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError); return; } - QList headerList = request.rawHeaderList(); - if (headerList.count() > 0) { - } + // HTML WebSockets do not support arbitrary request headers, but + // do support the WebSocket protocol header. This header is + // required for some use cases like MQTT. + QByteArray protocolHeaderValue = request.rawHeader("Sec-WebSocket-Protocol"); + jsRequest(url.toString(), + protocolHeaderValue, (void *)&onOpenCallback, (void *)&onCloseCallback, (void *)&onErrorCallback, (void *)&onIncomingMessageCallback); } -void QWebSocketPrivate::jsRequest(const QString &url, void *openCallback, void *closeCallback, void *errorCallback, void *incomingMessageCallback) +void QWebSocketPrivate::jsRequest(const QString &url, const QByteArray &protocolHeader, void *openCallback, void *closeCallback, void *errorCallback, void *incomingMessageCallback) { EM_ASM_ARGS({ var wsUri = Pointer_stringify($0); - var handler = $1; - var onOpenCallbackPointer = $2; - var onCloseCallback = $3; - var onErrorCallback = $4; - var onIncomingMessageCallback = $5; + var wsProtocol = Pointer_stringify($1); + var handler = $2; + var onOpenCallbackPointer = $3; + var onCloseCallback = $4; + var onErrorCallback = $5; + var onIncomingMessageCallback = $6; function connectWebSocket() { if (window.webSocker == undefined) { window.webSocker = {}; - window.webSocker = new WebSocket(wsUri); + if (wsProtocol.length > 0) { + window.webSocker = new WebSocket(wsUri, wsProtocol); + } else { + window.webSocker = new WebSocket(wsUri); + } window.webSocker.onopen = onOpen; window.webSocker.onclose = onClose; @@ -490,6 +498,7 @@ void QWebSocketPrivate::jsRequest(const QString &url, void *openCallback, void * connectWebSocket(); }, url.toLatin1().data(), + protocolHeader.constData(), this, (void *)openCallback, (void *)closeCallback, diff --git a/src/websockets/qwebsocket_wasm_p.h b/src/websockets/qwebsocket_wasm_p.h index b293f6c..383cdf7 100644 --- a/src/websockets/qwebsocket_wasm_p.h +++ b/src/websockets/qwebsocket_wasm_p.h @@ -219,7 +219,7 @@ private: friend class QWebSocketServerPrivate; - void jsRequest(const QString &url, void *openCallback, void *closeCallback, void *errorCallback, void *incomingMessageCallback); + void jsRequest(const QString &url, const QByteArray &protocol, void *openCallback, void *closeCallback, void *errorCallback, void *incomingMessageCallback); QAbstractSocket::SocketError m_lastError; }; -- cgit v1.2.1