summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLorn Potter <lorn.potter@gmail.com>2022-08-04 15:09:03 +1000
committerLorn Potter <lorn.potter@gmail.com>2022-08-10 19:17:29 +1000
commitd46a70113fed1483bea3c44f5e39d64930cfff07 (patch)
treec8a0e3e9b255941c6221a688db703816e3d71286 /src
parent4d943068949ca2411ca69c902def9d7e7c826e44 (diff)
downloadqtwebsockets-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.h1
-rw-r--r--src/websockets/qwebsocket_wasm_p.cpp37
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("");
+}