From 22c10dc825cb8fe329391dc23d8cd30397a3823e Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Mon, 23 Mar 2015 14:37:57 +0100 Subject: Readme: Refer to code.qt.io, not gitorious Gitorious was sold and will close down shop soon. Change-Id: Ic27da9a45a42f2dc7ba2badf3f3b10a6ec058e8d Reviewed-by: Liang Qi --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68d513b..27510e0 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ It is implemented as a Qt add-on module, that can easily be embedded into existi Qt 5.x ### Build And Usage -Checkout the source code from gitorious +Checkout the source code from code.qt.io Go into the source directory and execute: qmake -- cgit v1.2.1 From 5b469aa3c4d6b9c68feb9cf92d03614077518894 Mon Sep 17 00:00:00 2001 From: Kimmo Karvinen Date: Tue, 31 Mar 2015 17:14:33 +0300 Subject: Fixed a crash when destroying the QWebSocketServer Lifetime of incoming QTcpSocket/QSslSocket are managed by the QTcpServer/QSslServer and thus the QWebSocketPrivate should clear the pointer to the socket when the socket is destroyed. Added auto test for the crash. Task-number: QTBUG-45331 Change-Id: I6e30e7cdcca22aa810ccc1a1d4d7d77c7cb2c349 Reviewed-by: Steven Ceuppens Reviewed-by: Liang Qi --- src/websockets/qwebsocket_p.cpp | 11 +++++++ src/websockets/qwebsocket_p.h | 2 ++ .../auto/qwebsocketserver/tst_qwebsocketserver.cpp | 34 ++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index ced197e..76a5882 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -542,6 +542,10 @@ void QWebSocketPrivate::makeConnections(const QTcpSocket *pTcpSocket) QObject::connect(pTcpSocket, &QAbstractSocket::aboutToClose, q, &QWebSocket::aboutToClose); QObject::connect(pTcpSocket, &QAbstractSocket::bytesWritten, q, &QWebSocket::bytesWritten); + + QObjectPrivate::connect(pTcpSocket, &QObject::destroyed, + this, &QWebSocketPrivate::socketDestroyed); + //catch signals QObjectPrivate::connect(pTcpSocket, &QAbstractSocket::stateChanged, this, &QWebSocketPrivate::processStateChanged); @@ -1048,6 +1052,13 @@ void QWebSocketPrivate::processStateChanged(QAbstractSocket::SocketState socketS } } +void QWebSocketPrivate::socketDestroyed(QObject *socket) +{ + Q_ASSERT(m_pSocket); + if (m_pSocket.data() == socket) + m_pSocket.take(); +} + /*! \internal */ diff --git a/src/websockets/qwebsocket_p.h b/src/websockets/qwebsocket_p.h index f13e08d..85d3f49 100644 --- a/src/websockets/qwebsocket_p.h +++ b/src/websockets/qwebsocket_p.h @@ -162,6 +162,8 @@ private: void setSocketState(QAbstractSocket::SocketState state); void setErrorString(const QString &errorString); + void socketDestroyed(QObject *socket); + void processData(); void processPing(const QByteArray &data); void processPong(const QByteArray &data); diff --git a/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp b/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp index f585620..8ee0a36 100644 --- a/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp +++ b/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp @@ -64,6 +64,7 @@ private Q_SLOTS: void tst_listening(); void tst_connectivity(); void tst_maxPendingConnections(); + void tst_serverDestroyedWhileSocketConnected(); }; tst_QWebSocketServer::tst_QWebSocketServer() @@ -350,6 +351,39 @@ void tst_QWebSocketServer::tst_maxPendingConnections() QCOMPARE(serverAcceptErrorSpy.count(), 0); } +void tst_QWebSocketServer::tst_serverDestroyedWhileSocketConnected() +{ + QWebSocketServer * server = new QWebSocketServer(QString(), QWebSocketServer::NonSecureMode); + QSignalSpy serverConnectionSpy(server, SIGNAL(newConnection())); + QSignalSpy corsAuthenticationSpy(server, + SIGNAL(originAuthenticationRequired(QWebSocketCorsAuthenticator*))); + QSignalSpy serverClosedSpy(server, SIGNAL(closed())); + + QWebSocket socket; + QSignalSpy socketConnectedSpy(&socket, SIGNAL(connected())); + QSignalSpy socketDisconnectedSpy(&socket, SIGNAL(disconnected())); + + QVERIFY(server->listen()); + QCOMPARE(server->serverAddress(), QHostAddress(QHostAddress::Any)); + QCOMPARE(server->serverUrl(), QUrl(QStringLiteral("ws://") + QHostAddress(QHostAddress::LocalHost).toString() + + QStringLiteral(":").append(QString::number(server->serverPort())))); + + socket.open(server->serverUrl().toString()); + + if (socketConnectedSpy.count() == 0) + QVERIFY(socketConnectedSpy.wait()); + QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); + QCOMPARE(serverConnectionSpy.count(), 1); + QCOMPARE(corsAuthenticationSpy.count(), 1); + + QCOMPARE(serverClosedSpy.count(), 0); + + delete server; + + if (socketDisconnectedSpy.count() == 0) + QVERIFY(socketDisconnectedSpy.wait()); + QCOMPARE(socketDisconnectedSpy.count(), 1); +} QTEST_MAIN(tst_QWebSocketServer) -- cgit v1.2.1 From 30b5e99da347aea446a5a3a334a21a4406adc4fe Mon Sep 17 00:00:00 2001 From: Luca Niccoli Date: Mon, 9 Mar 2015 19:20:26 +0100 Subject: Always initialize m_handshakeState The client-side constructor was leaving it uninitialized, which would sometimes lead to spurious error signals being emitted. Task-number: QTBUG-44893 Change-Id: I7a17f1a16d9a5fe4218beb6d92993c1889ad836b Reviewed-by: Oswald Buddenhagen Reviewed-by: Liang Qi --- src/websockets/qwebsocket_p.cpp | 3 ++- tests/auto/qwebsocket/tst_qwebsocket.cpp | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 2bb5151..8aa2fe1 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -105,7 +105,8 @@ QWebSocketPrivate::QWebSocketPrivate(const QString &origin, QWebSocketProtocol:: m_dataProcessor(), m_configuration(), m_pMaskGenerator(&m_defaultMaskGenerator), - m_defaultMaskGenerator() + m_defaultMaskGenerator(), + m_handshakeState(NothingDoneState) { } diff --git a/tests/auto/qwebsocket/tst_qwebsocket.cpp b/tests/auto/qwebsocket/tst_qwebsocket.cpp index 900f316..7659e89 100644 --- a/tests/auto/qwebsocket/tst_qwebsocket.cpp +++ b/tests/auto/qwebsocket/tst_qwebsocket.cpp @@ -410,6 +410,7 @@ void tst_QWebSocket::tst_sendTextMessage() QSignalSpy textFrameReceived(&socket, SIGNAL(textFrameReceived(QString,bool))); QSignalSpy binaryMessageReceived(&socket, SIGNAL(binaryMessageReceived(QByteArray))); QSignalSpy binaryFrameReceived(&socket, SIGNAL(binaryFrameReceived(QByteArray,bool))); + QSignalSpy socketError(&socket, SIGNAL(error(QAbstractSocket::SocketError))); QUrl url = QUrl(QStringLiteral("ws://") + echoServer.hostAddress().toString() + QStringLiteral(":") + QString::number(echoServer.port())); @@ -419,6 +420,7 @@ void tst_QWebSocket::tst_sendTextMessage() if (socketConnectedSpy.count() == 0) QVERIFY(socketConnectedSpy.wait(500)); + QCOMPARE(socketError.count(), 0); QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); socket.sendTextMessage(QStringLiteral("Hello world!")); -- cgit v1.2.1 From eb197b8f22e90acb2ee6d9699cce04a402d16538 Mon Sep 17 00:00:00 2001 From: Luca Niccoli Date: Wed, 8 Apr 2015 15:45:25 +0200 Subject: Fix urls in client compliance test Change-Id: I0dc9427934cc7523b524966d45820f96b6a4642d Reviewed-by: Liang Qi --- tests/manual/compliance/tst_compliance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/manual/compliance/tst_compliance.cpp b/tests/manual/compliance/tst_compliance.cpp index f929b16..6e8de62 100644 --- a/tests/manual/compliance/tst_compliance.cpp +++ b/tests/manual/compliance/tst_compliance.cpp @@ -105,7 +105,7 @@ void tst_ComplianceTest::runTestCase(int nbr, int total) qDebug() << "Executing test" << (nbr + 1) << "/" << total; QUrl url = m_url; - url.setPath(QStringLiteral("/runCase?")); + url.setPath(QStringLiteral("/runCase")); QUrlQuery query; query.addQueryItem(QStringLiteral("case"), QString::number(nbr + 1)); query.addQueryItem(QStringLiteral("agent"), QStringLiteral("QtWebSockets/1.0")); @@ -142,7 +142,7 @@ void tst_ComplianceTest::autobahnTest() QObject::disconnect(pWebSocket, &QWebSocket::textMessageReceived, 0, 0); runTestCases(0, numberOfTestCases); - url.setPath(QStringLiteral("/updateReports?")); + url.setPath(QStringLiteral("/updateReports")); QUrlQuery query; query.addQueryItem(QStringLiteral("agent"), QStringLiteral("QtWebSockets")); url.setQuery(query); -- cgit v1.2.1 From 48418a2e16b6dede3bc002dda5a3cb277fd3e802 Mon Sep 17 00:00:00 2001 From: Luca Niccoli Date: Mon, 9 Mar 2015 18:48:31 +0100 Subject: Do not decode the HTTP resource name The resource needs to be sent encoded in the HTTP request. Task-number: QTBUG-44889 Change-Id: I3c6c56f5fea1553f3b5751de7da0cfc76150f4b9 Reviewed-by: Liang Qi --- src/websockets/qwebsocket_p.cpp | 5 +++-- tests/auto/qwebsocket/tst_qwebsocket.cpp | 13 ++++++++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 8aa2fe1..3280377 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -353,8 +353,9 @@ void QWebSocketPrivate::open(const QUrl &url, bool mask) m_isClosingHandshakeSent = false; setRequestUrl(url); - QString resourceName = url.path(); - if (resourceName.contains(QStringLiteral("\r\n"))) { + QString resourceName = url.path(QUrl::FullyEncoded); + // Check for encoded \r\n + if (resourceName.contains(QStringLiteral("%0D%0A"))) { setRequestUrl(QUrl()); //clear requestUrl setErrorString(QWebSocket::tr("Invalid resource name.")); Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError); diff --git a/tests/auto/qwebsocket/tst_qwebsocket.cpp b/tests/auto/qwebsocket/tst_qwebsocket.cpp index 7659e89..aca25d0 100644 --- a/tests/auto/qwebsocket/tst_qwebsocket.cpp +++ b/tests/auto/qwebsocket/tst_qwebsocket.cpp @@ -50,6 +50,9 @@ public: QHostAddress hostAddress() const { return m_pWebSocketServer->serverAddress(); } quint16 port() const { return m_pWebSocketServer->serverPort(); } +Q_SIGNALS: + void newConnection(QUrl requestUrl); + private Q_SLOTS: void onNewConnection(); void processTextMessage(QString message); @@ -83,6 +86,8 @@ void EchoServer::onNewConnection() { QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection(); + Q_EMIT newConnection(pSocket->requestUrl()); + connect(pSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(processTextMessage(QString))); connect(pSocket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(processBinaryMessage(QByteArray))); connect(pSocket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); @@ -406,6 +411,7 @@ void tst_QWebSocket::tst_sendTextMessage() QCOMPARE(socket.sendTextMessage(QStringLiteral("1234")), 0); QSignalSpy socketConnectedSpy(&socket, SIGNAL(connected())); + QSignalSpy serverConnectedSpy(&echoServer, SIGNAL(newConnection(QUrl))); QSignalSpy textMessageReceived(&socket, SIGNAL(textMessageReceived(QString))); QSignalSpy textFrameReceived(&socket, SIGNAL(textFrameReceived(QString,bool))); QSignalSpy binaryMessageReceived(&socket, SIGNAL(binaryMessageReceived(QByteArray))); @@ -414,6 +420,7 @@ void tst_QWebSocket::tst_sendTextMessage() QUrl url = QUrl(QStringLiteral("ws://") + echoServer.hostAddress().toString() + QStringLiteral(":") + QString::number(echoServer.port())); + url.setPath("/segment/with spaces"); url.addQueryItem("queryitem", "with encoded characters"); socket.open(url); @@ -422,6 +429,10 @@ void tst_QWebSocket::tst_sendTextMessage() QVERIFY(socketConnectedSpy.wait(500)); QCOMPARE(socketError.count(), 0); QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); + QCOMPARE(serverConnectedSpy.count(), 1); + QList arguments = serverConnectedSpy.takeFirst(); + QUrl urlConnected = arguments.at(0).toUrl(); + QCOMPARE(urlConnected, url); socket.sendTextMessage(QStringLiteral("Hello world!")); @@ -429,7 +440,7 @@ void tst_QWebSocket::tst_sendTextMessage() QCOMPARE(textMessageReceived.count(), 1); QCOMPARE(binaryMessageReceived.count(), 0); QCOMPARE(binaryFrameReceived.count(), 0); - QList arguments = textMessageReceived.takeFirst(); + arguments = textMessageReceived.takeFirst(); QString messageReceived = arguments.at(0).toString(); QCOMPARE(messageReceived, QStringLiteral("Hello world!")); -- cgit v1.2.1 From 0fcfc33963a48dee74eb971decbf89f35c3240f0 Mon Sep 17 00:00:00 2001 From: Luca Niccoli Date: Thu, 9 Apr 2015 11:37:02 +0200 Subject: Fix copy constructor Change-Id: I2c27bda6523ff84d9ea9178f1e6728bf4defc511 Reviewed-by: Oswald Buddenhagen Reviewed-by: Liang Qi --- src/websockets/qwebsocketframe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/websockets/qwebsocketframe.cpp b/src/websockets/qwebsocketframe.cpp index a4e644b..d533921 100644 --- a/src/websockets/qwebsocketframe.cpp +++ b/src/websockets/qwebsocketframe.cpp @@ -102,7 +102,7 @@ QWebSocketFrame &QWebSocketFrame::operator =(const QWebSocketFrame &other) m_mask = other.m_mask; m_rsv1 = other.m_rsv1; m_rsv2 = other.m_rsv2; - m_rsv3 = other.m_rsv2; + m_rsv3 = other.m_rsv3; m_opCode = other.m_opCode; m_length = other.m_length; m_payload = other.m_payload; -- cgit v1.2.1