summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-05-11 11:00:27 +0200
committerLiang Qi <liang.qi@theqtcompany.com>2015-05-11 11:00:27 +0200
commitb25dc4141782776ff321400c204a27ab3adbcea6 (patch)
treef6523278592e03c8900f09ddda95f594d7d622b2
parentba3b71327577f3ea348e9511c1475cf48f821880 (diff)
parent0a9cbcf2894f4f9e621e0f5fb644d2b5e15ab2c7 (diff)
downloadqtwebsockets-b25dc4141782776ff321400c204a27ab3adbcea6.tar.gz
Merge remote-tracking branch 'origin/5.5' into dev
Conflicts: src/websockets/qwebsocket_p.cpp Change-Id: Ia6434b282b4a0ee92e2b2a8664389f325bd0fcb0
-rw-r--r--README.md2
-rw-r--r--src/websockets/qwebsocket_p.cpp19
-rw-r--r--src/websockets/qwebsocket_p.h2
-rw-r--r--src/websockets/qwebsocketframe.cpp2
-rw-r--r--tests/auto/qwebsocket/tst_qwebsocket.cpp15
-rw-r--r--tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp34
-rw-r--r--tests/manual/compliance/tst_compliance.cpp4
7 files changed, 70 insertions, 8 deletions
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
diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp
index ab466bd..28c24ae 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)
{
}
@@ -354,8 +355,9 @@ void QWebSocketPrivate::open(const QNetworkRequest &request, bool mask)
m_isClosingHandshakeSent = false;
setRequest(request);
- 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"))) {
setRequest(QNetworkRequest()); //clear request
setErrorString(QWebSocket::tr("Invalid resource name."));
Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError);
@@ -545,6 +547,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);
@@ -1080,6 +1086,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 e688463..615bcfc 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/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;
diff --git a/tests/auto/qwebsocket/tst_qwebsocket.cpp b/tests/auto/qwebsocket/tst_qwebsocket.cpp
index ed400ef..2422012 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()));
@@ -407,20 +412,28 @@ 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)));
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()));
+ url.setPath("/segment/with spaces");
url.addQueryItem("queryitem", "with encoded characters");
socket.open(url);
if (socketConnectedSpy.count() == 0)
QVERIFY(socketConnectedSpy.wait(500));
+ QCOMPARE(socketError.count(), 0);
QCOMPARE(socket.state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(serverConnectedSpy.count(), 1);
+ QList<QVariant> arguments = serverConnectedSpy.takeFirst();
+ QUrl urlConnected = arguments.at(0).toUrl();
+ QCOMPARE(urlConnected, url);
socket.sendTextMessage(QStringLiteral("Hello world!"));
@@ -428,7 +441,7 @@ void tst_QWebSocket::tst_sendTextMessage()
QCOMPARE(textMessageReceived.count(), 1);
QCOMPARE(binaryMessageReceived.count(), 0);
QCOMPARE(binaryFrameReceived.count(), 0);
- QList<QVariant> arguments = textMessageReceived.takeFirst();
+ arguments = textMessageReceived.takeFirst();
QString messageReceived = arguments.at(0).toString();
QCOMPARE(messageReceived, QStringLiteral("Hello world!"));
diff --git a/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp b/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp
index 985b91c..c2ba842 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)
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);