diff options
Diffstat (limited to 'src/websockets')
-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(""); +} |