diff options
author | Lorn Potter <lorn.potter@gmail.com> | 2022-08-04 15:09:03 +1000 |
---|---|---|
committer | Lorn Potter <lorn.potter@gmail.com> | 2022-08-10 19:17:29 +1000 |
commit | d46a70113fed1483bea3c44f5e39d64930cfff07 (patch) | |
tree | c8a0e3e9b255941c6221a688db703816e3d71286 /src | |
parent | 4d943068949ca2411ca69c902def9d7e7c826e44 (diff) | |
download | qtwebsockets-d46a70113fed1483bea3c44f5e39d64930cfff07.tar.gz |
wasm: improve close code message
The close reason from emscripten was usually empty, so provide one.
Pick-to: 6.4
Change-Id: I0c0617c805cc00aa9a575f05c8319560e33569d2
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/websockets/qwebsocket_p.h | 1 | ||||
-rw-r--r-- | src/websockets/qwebsocket_wasm_p.cpp | 37 |
2 files changed, 35 insertions, 3 deletions
diff --git a/src/websockets/qwebsocket_p.h b/src/websockets/qwebsocket_p.h index 90b1674..48f7fb3 100644 --- a/src/websockets/qwebsocket_p.h +++ b/src/websockets/qwebsocket_p.h @@ -139,6 +139,7 @@ public: static quint64 maxOutgoingFrameSize(); #ifdef Q_OS_WASM void setSocketClosed(const EmscriptenWebSocketCloseEvent *emCloseEvent); + QString closeCodeToString(QWebSocketProtocol::CloseCode code); #endif private: QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol::Version version); diff --git a/src/websockets/qwebsocket_wasm_p.cpp b/src/websockets/qwebsocket_wasm_p.cpp index 113db60..398fd01 100644 --- a/src/websockets/qwebsocket_wasm_p.cpp +++ b/src/websockets/qwebsocket_wasm_p.cpp @@ -143,10 +143,18 @@ void QWebSocketPrivate::open(const QNetworkRequest &request, bool isSecureContext = (navProtocol.as<std::string>().find("https") == 0); if (!url.isValid() - || url.toString().contains(QStringLiteral("\r\n")) - || (isSecureContext && url.scheme() == QStringLiteral("ws"))) { + || url.toString().contains(QStringLiteral("\r\n"))) { setErrorString(QWebSocket::tr("Connection refused")); + emitErrorOccurred(QAbstractSocket::ConnectionRefusedError); + + return; + } + if (isSecureContext && url.scheme() == QStringLiteral("ws")) { + const QString message = + QWebSocket::tr("Unsupported WebSocket scheme: %1").arg(url.scheme()); + setErrorString(message); + emitErrorOccurred(QAbstractSocket::UnsupportedSocketOperationError); return; } @@ -225,8 +233,11 @@ void QWebSocketPrivate::setSocketClosed(const EmscriptenWebSocketCloseEvent *emC { Q_Q(QWebSocket); m_closeCode = (QWebSocketProtocol::CloseCode)emCloseEvent->code; + + m_closeReason = QString::fromUtf8(emCloseEvent->reason); + if (m_closeReason.isEmpty()) { - m_closeReason = QString::fromUtf8(emCloseEvent->reason); + m_closeReason = closeCodeToString(m_closeCode); } if (m_socketState == QAbstractSocket::ConnectedState) { @@ -247,3 +258,23 @@ void QWebSocketPrivate::setSocketClosed(const EmscriptenWebSocketCloseEvent *emC m_socketContext = 0; } } + +QString QWebSocketPrivate::closeCodeToString(QWebSocketProtocol::CloseCode code) +{ + switch (code) { + case QWebSocketProtocol::CloseCodeNormal: return QStringLiteral("Normal closure"); + case QWebSocketProtocol::CloseCodeGoingAway: return QStringLiteral("Going away"); + case QWebSocketProtocol::CloseCodeProtocolError: return QStringLiteral("Protocol error"); + case QWebSocketProtocol::CloseCodeDatatypeNotSupported: return QStringLiteral("Unsupported data"); + case QWebSocketProtocol::CloseCodeReserved1004: return QStringLiteral("Reserved"); + case QWebSocketProtocol::CloseCodeMissingStatusCode: return QStringLiteral("No status received"); + case QWebSocketProtocol::CloseCodeAbnormalDisconnection: return QStringLiteral("Abnormal closure"); + case QWebSocketProtocol::CloseCodeWrongDatatype: return QStringLiteral("Invalid frame payload data"); + case QWebSocketProtocol::CloseCodePolicyViolated: return QStringLiteral("Policy violation"); + case QWebSocketProtocol::CloseCodeTooMuchData: return QStringLiteral("Message too big"); + case QWebSocketProtocol::CloseCodeMissingExtension: return QStringLiteral("Mandatory extension missing"); + case QWebSocketProtocol::CloseCodeBadOperation: return QStringLiteral("Internal server error"); + case QWebSocketProtocol::CloseCodeTlsHandshakeFailed: return QStringLiteral("TLS handshake failed"); + }; + return QStringLiteral(""); +} |