From ef7b03e3e5e20f89963bae799f7ecb753f332c34 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 7 Apr 2016 08:41:17 +0200 Subject: Doc: Add verb to WebSockets intro Change-Id: I4c9f3a50c24f945c0f14010a10ff808d8adf7845 Reviewed-by: Leena Miettinen --- src/websockets/doc/src/overview.qdoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/websockets/doc/src/overview.qdoc b/src/websockets/doc/src/overview.qdoc index eb9e429..e85461a 100644 --- a/src/websockets/doc/src/overview.qdoc +++ b/src/websockets/doc/src/overview.qdoc @@ -39,7 +39,7 @@ Historically, web applications that needed bidirectional communication or push notifications had to use one of the HTTP-based solutions available. These solutions employed different techniques such as polling, long-polling, and streaming, to overcome the limitations of HTTP protocol, which is not designed -for such use cases. As a result, high network latency, unnecessary data +for such use cases. This resulted in high network latency, unnecessary data exchange, and stale or old data. The WebSocket offering by IETF helps to overcome these problems to a large extent. -- cgit v1.2.1 From 9a4b09864461b95a3e6f18d6ea89b4bac674146c Mon Sep 17 00:00:00 2001 From: Aleksey Lysenko Date: Tue, 13 Dec 2016 09:35:19 +0200 Subject: Fixed WebSocket status doc Task-number: QTBUG-57523 Change-Id: I2c7f6c2467ba615d1bcbb9d659e27bb242373710 Reviewed-by: Martin Smith --- src/imports/qmlwebsockets/qqmlwebsocket.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/imports/qmlwebsockets/qqmlwebsocket.cpp b/src/imports/qmlwebsockets/qqmlwebsocket.cpp index 9ff88d5..35f6259 100644 --- a/src/imports/qmlwebsockets/qqmlwebsocket.cpp +++ b/src/imports/qmlwebsockets/qqmlwebsocket.cpp @@ -63,11 +63,11 @@ The status can have the following values: \list - \li WebSockets.Connecting - \li WebSockets.Open - \li WebSockets.Closing - \li WebSockets.Closed - \li WebSockets.Error + \li WebSocket.Connecting + \li WebSocket.Open + \li WebSocket.Closing + \li WebSocket.Closed + \li WebSocket.Error \endlist */ -- cgit v1.2.1 From b2d610c0ea229e40910fc9aa1bc784d853cfeba8 Mon Sep 17 00:00:00 2001 From: Aleksey Lysenko Date: Tue, 6 Dec 2016 09:50:30 +0200 Subject: Delete disconnected socket Method onSocketDisconnected has never been called, so WebSocketServer did not handle closed connection properly. Moreover, socket was not freed in time and this led to increase in memory consumption Task-number: QTBUG-56414 Change-Id: Ib57f5b88413ffeef4f296a260245ba0a8d25adb2 Reviewed-by: Timur Pocheptsov Reviewed-by: Liang Qi --- src/websockets/qwebsocketserver_p.cpp | 6 ++++-- src/websockets/qwebsocketserver_p.h | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/websockets/qwebsocketserver_p.cpp b/src/websockets/qwebsocketserver_p.cpp index 91bfafc..3bf6d68 100644 --- a/src/websockets/qwebsocketserver_p.cpp +++ b/src/websockets/qwebsocketserver_p.cpp @@ -392,18 +392,20 @@ void QWebSocketServerPrivate::onNewConnection() QObjectPrivate::connect(pTcpSocket, &QTcpSocket::readyRead, this, &QWebSocketServerPrivate::handshakeReceived, Qt::QueuedConnection); + QObjectPrivate::connect(pTcpSocket, &QTcpSocket::disconnected, + this, &QWebSocketServerPrivate::onSocketDisconnected); } } /*! \internal */ -void QWebSocketServerPrivate::onCloseConnection() +void QWebSocketServerPrivate::onSocketDisconnected() { if (Q_LIKELY(currentSender)) { QTcpSocket *pTcpSocket = qobject_cast(currentSender->sender); if (Q_LIKELY(pTcpSocket)) - pTcpSocket->close(); + pTcpSocket->deleteLater(); } } diff --git a/src/websockets/qwebsocketserver_p.h b/src/websockets/qwebsocketserver_p.h index 46a2156..6aabebd 100644 --- a/src/websockets/qwebsocketserver_p.h +++ b/src/websockets/qwebsocketserver_p.h @@ -136,7 +136,7 @@ private: const QString &errorDescription); void onNewConnection(); - void onCloseConnection(); + void onSocketDisconnected(); void handshakeReceived(); }; -- cgit v1.2.1 From a5c85e3250a10a8e23ce15f9a6811136f6bb23fd Mon Sep 17 00:00:00 2001 From: Aleksey Lysenko Date: Wed, 14 Dec 2016 10:39:29 +0200 Subject: Fixed QWebSocketServer::SslMode collision Value of NonSecureMode enumerator depends on QT_NO_SSL. If Qt is built with QT_NO_SSL defined, NonSecureMode is equal to 0, otherwise it is equal to 1. It may lead to problem if user built app with libs where NonSecureMode = 0, but run it with libs where NonSecureMode = 1. [ChangeLog][QWebSocketServer] SslMode::NonSecure enumerator now always has the same value (1) regardless of SSL enabled or disabled. Task-number: QTBUG-56129 Change-Id: If17137eff4b19015697c827a985ef89dd95a5611 Reviewed-by: Timur Pocheptsov --- src/websockets/qwebsocketserver.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/websockets/qwebsocketserver.h b/src/websockets/qwebsocketserver.h index 47113e4..511a55b 100644 --- a/src/websockets/qwebsocketserver.h +++ b/src/websockets/qwebsocketserver.h @@ -69,9 +69,9 @@ class Q_WEBSOCKETS_EXPORT QWebSocketServer : public QObject public: enum SslMode { #ifndef QT_NO_SSL - SecureMode, + SecureMode = 0, #endif - NonSecureMode + NonSecureMode = 1 }; explicit QWebSocketServer(const QString &serverName, SslMode secureMode, -- cgit v1.2.1 From 503a1353dcf23f8a5fcb8a2c79d55f707e75cf33 Mon Sep 17 00:00:00 2001 From: Aleksey Lysenko Date: Fri, 16 Dec 2016 15:57:26 +0200 Subject: Fixed wrong scheme for secure websocket Websocket server always constructed QWebSocketHandshakeRequest like for non-secure socket without checking SecureMode. This led to the fact that secure socket had "ws" scheme. Task-number: QTBUG-55927 Change-Id: I881766f55182136072fd23f3fefe93ea60f3d27d Reviewed-by: Timur Pocheptsov --- src/websockets/qwebsocketserver_p.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/websockets/qwebsocketserver_p.cpp b/src/websockets/qwebsocketserver_p.cpp index 3bf6d68..d675056 100644 --- a/src/websockets/qwebsocketserver_p.cpp +++ b/src/websockets/qwebsocketserver_p.cpp @@ -435,7 +435,7 @@ void QWebSocketServerPrivate::handshakeReceived() this, &QWebSocketServerPrivate::handshakeReceived); Q_Q(QWebSocketServer); bool success = false; - bool isSecure = false; + bool isSecure = (m_secureMode == SecureMode); if (m_pendingConnections.length() >= maxPendingConnections()) { pTcpSocket->close(); -- cgit v1.2.1 From 2eeee81b67ce4fc81793c51bafd2cc1b33076c05 Mon Sep 17 00:00:00 2001 From: Aleksey Lysenko Date: Tue, 3 Jan 2017 22:59:36 +0200 Subject: Fixed possible block clearing in QWebSocketDataProcessor::process method In QWebSocketDataProcessor::process() the signals text(binary)MessageReceived are emitted before clear() method. If signal handler blocks loop (for example, using QDialog::exec()), clear() will be called only after resuming loop. It may lead to the data corruption due to the fact that QWebSocketDataProcessor clearing won't be performed before the new data arrived. Task-number: QTBUG-55506 Change-Id: Ib7016a91d3987dec7c1af977b17f86a53568c413 Reviewed-by: Timur Pocheptsov --- src/websockets/qwebsocketdataprocessor.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/websockets/qwebsocketdataprocessor.cpp b/src/websockets/qwebsocketdataprocessor.cpp index 520ecdc..d9fc550 100644 --- a/src/websockets/qwebsocketdataprocessor.cpp +++ b/src/websockets/qwebsocketdataprocessor.cpp @@ -182,12 +182,16 @@ void QWebSocketDataProcessor::process(QIODevice *pIoDevice) } if (frame.isFinalFrame()) { - if (m_opCode == QWebSocketProtocol::OpCodeText) - Q_EMIT textMessageReceived(m_textMessage); - else - Q_EMIT binaryMessageReceived(m_binaryMessage); - clear(); isDone = true; + if (m_opCode == QWebSocketProtocol::OpCodeText) { + const QString textMessage(m_textMessage); + clear(); + Q_EMIT textMessageReceived(textMessage); + } else { + const QByteArray binaryMessage(m_binaryMessage); + clear(); + Q_EMIT binaryMessageReceived(binaryMessage); + } } } } else { -- cgit v1.2.1 From 670266a075c7c312c6a7f9465298bfec0b968ee2 Mon Sep 17 00:00:00 2001 From: Liang Qi Date: Wed, 7 Dec 2016 10:07:25 +0100 Subject: Fix the parser of port in hand shake request Use QUrl::setAuthority() to parse host and port. The request is invalid when having username or password in Host. Task-number: QTBUG-57357 Change-Id: I4e7c0370794dce15359d372a1e36dc0383083204 Reviewed-by: Thiago Macieira --- src/websockets/qwebsockethandshakerequest.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/websockets/qwebsockethandshakerequest.cpp b/src/websockets/qwebsockethandshakerequest.cpp index 81c5f97..ddeee2d 100644 --- a/src/websockets/qwebsockethandshakerequest.cpp +++ b/src/websockets/qwebsockethandshakerequest.cpp @@ -275,16 +275,12 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream, int maxH if (m_requestUrl.isRelative()) { // see http://tools.ietf.org/html/rfc6455#page-17 // No. 4 item in "The requirements for this handshake" - int idx = host.indexOf(QStringLiteral(":")); - bool ok = false; - int port = 0; - if (idx != -1) { - port = host.rightRef(host.length() - idx - 1).toInt(&ok); - host.truncate(idx); + m_requestUrl.setAuthority(host); + if (!m_requestUrl.userName().isNull()) { // If the username is null, the password must be too. + m_isValid = false; + clear(); + return; } - m_requestUrl.setHost(host); - if (ok) - m_requestUrl.setPort(port); } if (m_requestUrl.scheme().isEmpty()) { const QString scheme = isSecure() ? QStringLiteral("wss") : QStringLiteral("ws"); @@ -337,7 +333,7 @@ void QWebSocketHandshakeRequest::readHandshake(QTextStream &textStream, int maxH //TODO: authentication field - m_isValid = !(host.isEmpty() || + m_isValid = !(m_requestUrl.host().isEmpty() || resourceName.isEmpty() || m_versions.isEmpty() || m_key.isEmpty() || -- cgit v1.2.1