diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/imports/qmlwebsockets/plugins.qmltypes | 6 | ||||
-rw-r--r-- | src/imports/qmlwebsockets_compat/plugins.qmltypes | 6 | ||||
-rw-r--r-- | src/websockets/doc/qtwebsockets.qdocconf | 2 | ||||
-rw-r--r-- | src/websockets/qsslserver_p.h | 11 | ||||
-rw-r--r-- | src/websockets/qwebsocket.cpp | 29 | ||||
-rw-r--r-- | src/websockets/qwebsocket.h | 3 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.cpp | 53 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.h | 11 | ||||
-rw-r--r-- | src/websockets/qwebsocketframe.cpp | 54 | ||||
-rw-r--r-- | src/websockets/qwebsocketframe_p.h | 26 | ||||
-rw-r--r-- | src/websockets/qwebsockethandshakeresponse.cpp | 2 | ||||
-rw-r--r-- | src/websockets/qwebsocketprotocol_p.h | 11 | ||||
-rw-r--r-- | tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp | 2 | ||||
-rw-r--r-- | tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp | 46 | ||||
-rw-r--r-- | tests/auto/websockets/websocketframe/tst_websocketframe.cpp | 32 |
16 files changed, 188 insertions, 108 deletions
diff --git a/.qmake.conf b/.qmake.conf index 2ea3e52..924ada9 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -3,4 +3,4 @@ load(qt_build_config) CONFIG += qt_example_installs CONFIG += warning_clean -MODULE_VERSION = 5.5.1 +MODULE_VERSION = 5.6.0 diff --git a/src/imports/qmlwebsockets/plugins.qmltypes b/src/imports/qmlwebsockets/plugins.qmltypes index 5df4b5c..b79da44 100644 --- a/src/imports/qmlwebsockets/plugins.qmltypes +++ b/src/imports/qmlwebsockets/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -notrelocatable QtWebSockets 1.0' +// 'qmlplugindump -nonrelocatable QtWebSockets 1.0' Module { dependencies: [] @@ -56,7 +56,7 @@ Module { exportMetaObjectRevisions: [0] Property { name: "url"; type: "QUrl"; isReadonly: true } Property { name: "host"; type: "string" } - Property { name: "port"; type: "ushort" } + Property { name: "port"; type: "int" } Property { name: "name"; type: "string" } Property { name: "errorString"; type: "string"; isReadonly: true } Property { name: "listen"; type: "bool" } @@ -75,7 +75,7 @@ Module { } Signal { name: "portChanged" - Parameter { name: "port"; type: "ushort" } + Parameter { name: "port"; type: "int" } } Signal { name: "nameChanged" diff --git a/src/imports/qmlwebsockets_compat/plugins.qmltypes b/src/imports/qmlwebsockets_compat/plugins.qmltypes index ff8d976..961ed1c 100644 --- a/src/imports/qmlwebsockets_compat/plugins.qmltypes +++ b/src/imports/qmlwebsockets_compat/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -notrelocatable Qt.WebSockets 1.0' +// 'qmlplugindump -nonrelocatable Qt.WebSockets 1.0' Module { dependencies: [] @@ -56,7 +56,7 @@ Module { exportMetaObjectRevisions: [0] Property { name: "url"; type: "QUrl"; isReadonly: true } Property { name: "host"; type: "string" } - Property { name: "port"; type: "ushort" } + Property { name: "port"; type: "int" } Property { name: "name"; type: "string" } Property { name: "errorString"; type: "string"; isReadonly: true } Property { name: "listen"; type: "bool" } @@ -75,7 +75,7 @@ Module { } Signal { name: "portChanged" - Parameter { name: "port"; type: "ushort" } + Parameter { name: "port"; type: "int" } } Signal { name: "nameChanged" diff --git a/src/websockets/doc/qtwebsockets.qdocconf b/src/websockets/doc/qtwebsockets.qdocconf index ba77c82..4504d30 100644 --- a/src/websockets/doc/qtwebsockets.qdocconf +++ b/src/websockets/doc/qtwebsockets.qdocconf @@ -4,7 +4,7 @@ project = QtWebSockets description = Qt WebSockets Reference Documentation version = $QT_VERSION -examplesinstallpath = websockets +examplesinstallpath = qtwebsockets/websockets qhp.projects = QtWebSockets diff --git a/src/websockets/qsslserver_p.h b/src/websockets/qsslserver_p.h index 18e1a19..bb8c7f9 100644 --- a/src/websockets/qsslserver_p.h +++ b/src/websockets/qsslserver_p.h @@ -34,6 +34,17 @@ #ifndef QSSLSERVER_P_H #define QSSLSERVER_P_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include <QtNetwork/QTcpServer> #include <QtNetwork/QSslError> #include <QtNetwork/QSslConfiguration> diff --git a/src/websockets/qwebsocket.cpp b/src/websockets/qwebsocket.cpp index ee9b2d2..0286196 100644 --- a/src/websockets/qwebsocket.cpp +++ b/src/websockets/qwebsocket.cpp @@ -391,7 +391,22 @@ void QWebSocket::close(QWebSocketProtocol::CloseCode closeCode, const QString &r void QWebSocket::open(const QUrl &url) { Q_D(QWebSocket); - d->open(url, true); + QNetworkRequest request(url); + d->open(request, true); +} + +/*! + \brief Opens a WebSocket connection using the given \a request. + \since 5.6 + + The \a request url will be used to open the WebSocket connection. + Headers present in the request will be sent to the server in the upgrade request, + together with the ones needed for the websocket handshake. + */ +void QWebSocket::open(const QNetworkRequest &request) +{ + Q_D(QWebSocket); + d->open(request, true); } /*! @@ -514,7 +529,17 @@ QString QWebSocket::resourceName() const QUrl QWebSocket::requestUrl() const { Q_D(const QWebSocket); - return d->requestUrl(); + return d->request().url(); +} + +/*! + \brief Returns the request that was or will be used to open this socket. + \since 5.6 + */ +QNetworkRequest QWebSocket::request() const +{ + Q_D(const QWebSocket); + return d->request(); } /*! diff --git a/src/websockets/qwebsocket.h b/src/websockets/qwebsocket.h index 9fdc6eb..7ee4bc6 100644 --- a/src/websockets/qwebsocket.h +++ b/src/websockets/qwebsocket.h @@ -36,6 +36,7 @@ #include <QtCore/QUrl> #include <QtNetwork/QAbstractSocket> +#include <QtNetwork/QNetworkRequest> #ifndef QT_NO_NETWORKPROXY #include <QtNetwork/QNetworkProxy> #endif @@ -92,6 +93,7 @@ public: QWebSocketProtocol::Version version() const; QString resourceName() const; QUrl requestUrl() const; + QNetworkRequest request() const; QString origin() const; QWebSocketProtocol::CloseCode closeCode() const; QString closeReason() const; @@ -109,6 +111,7 @@ public Q_SLOTS: void close(QWebSocketProtocol::CloseCode closeCode = QWebSocketProtocol::CloseCodeNormal, const QString &reason = QString()); void open(const QUrl &url); + void open(const QNetworkRequest &request); void ping(const QByteArray &payload = QByteArray()); #ifndef QT_NO_SSL void ignoreSslErrors(); diff --git a/src/websockets/qwebsocket_p.cpp b/src/websockets/qwebsocket_p.cpp index 2a27abb..1722c15 100644 --- a/src/websockets/qwebsocket_p.cpp +++ b/src/websockets/qwebsocket_p.cpp @@ -88,7 +88,7 @@ QWebSocketPrivate::QWebSocketPrivate(const QString &origin, QWebSocketProtocol:: m_errorString(), m_version(version), m_resourceName(), - m_requestUrl(), + m_request(), m_origin(origin), m_protocol(), m_extension(), @@ -121,7 +121,7 @@ QWebSocketPrivate::QWebSocketPrivate(QTcpSocket *pTcpSocket, QWebSocketProtocol: m_errorString(pTcpSocket->errorString()), m_version(version), m_resourceName(), - m_requestUrl(), + m_request(), m_origin(), m_protocol(), m_extension(), @@ -288,9 +288,15 @@ QWebSocket *QWebSocketPrivate::upgradeFrom(QTcpSocket *pTcpSocket, { QWebSocket *pWebSocket = new QWebSocket(pTcpSocket, response.acceptedVersion(), parent); if (Q_LIKELY(pWebSocket)) { + QNetworkRequest netRequest(request.requestUrl()); + QMapIterator<QString, QString> headerIter(request.headers()); + while (headerIter.hasNext()) { + headerIter.next(); + netRequest.setRawHeader(headerIter.key().toLatin1(), headerIter.value().toLatin1()); + } pWebSocket->d_func()->setExtension(response.acceptedExtension()); pWebSocket->d_func()->setOrigin(request.origin()); - pWebSocket->d_func()->setRequestUrl(request.requestUrl()); + pWebSocket->d_func()->setRequest(netRequest); pWebSocket->d_func()->setProtocol(response.acceptedProtocol()); pWebSocket->d_func()->setResourceName(request.requestUrl().toString(QUrl::RemoveUserInfo)); //a server should not send masked frames @@ -337,12 +343,13 @@ void QWebSocketPrivate::close(QWebSocketProtocol::CloseCode closeCode, QString r /*! \internal */ -void QWebSocketPrivate::open(const QUrl &url, bool mask) +void QWebSocketPrivate::open(const QNetworkRequest &request, bool mask) { //just delete the old socket for the moment; //later, we can add more 'intelligent' handling by looking at the URL Q_Q(QWebSocket); + QUrl url = request.url(); if (!url.isValid() || url.toString().contains(QStringLiteral("\r\n"))) { setErrorString(QWebSocket::tr("Invalid URL.")); Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError); @@ -359,11 +366,11 @@ void QWebSocketPrivate::open(const QUrl &url, bool mask) m_isClosingHandshakeReceived = false; m_isClosingHandshakeSent = false; - setRequestUrl(url); + setRequest(request); QString resourceName = url.path(QUrl::FullyEncoded); // Check for encoded \r\n if (resourceName.contains(QStringLiteral("%0D%0A"))) { - setRequestUrl(QUrl()); //clear requestUrl + setRequest(QNetworkRequest()); //clear request setErrorString(QWebSocket::tr("Invalid resource name.")); Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError); return; @@ -486,10 +493,10 @@ void QWebSocketPrivate::setResourceName(const QString &resourceName) /*! \internal */ -void QWebSocketPrivate::setRequestUrl(const QUrl &requestUrl) +void QWebSocketPrivate::setRequest(const QNetworkRequest &request) { - if (m_requestUrl != requestUrl) - m_requestUrl = requestUrl; + if (m_request != request) + m_request = request; } /*! @@ -627,9 +634,9 @@ QString QWebSocketPrivate::resourceName() const /*! \internal */ -QUrl QWebSocketPrivate::requestUrl() const +QNetworkRequest QWebSocketPrivate::request() const { - return m_requestUrl; + return m_request; } /*! @@ -1046,22 +1053,29 @@ void QWebSocketPrivate::processStateChanged(QAbstractSocket::SocketState socketS Q_Q(QWebSocket); QAbstractSocket::SocketState webSocketState = this->state(); int port = 80; - if (m_requestUrl.scheme() == QStringLiteral("wss")) + if (m_request.url().scheme() == QStringLiteral("wss")) port = 443; switch (socketState) { case QAbstractSocket::ConnectedState: if (webSocketState == QAbstractSocket::ConnectingState) { m_key = generateKey(); + + QList<QPair<QString, QString> > headers; + foreach (const QByteArray &key, m_request.rawHeaderList()) + headers << qMakePair(QString::fromLatin1(key), + QString::fromLatin1(m_request.rawHeader(key))); + const QString handshake = createHandShakeRequest(m_resourceName, - m_requestUrl.host() + m_request.url().host() % QStringLiteral(":") - % QString::number(m_requestUrl.port(port)), + % QString::number(m_request.url().port(port)), origin(), QString(), QString(), - m_key); + m_key, + headers); if (handshake.isEmpty()) { m_pSocket->abort(); Q_EMIT q->error(QAbstractSocket::ConnectionRefusedError); @@ -1160,7 +1174,8 @@ QString QWebSocketPrivate::createHandShakeRequest(QString resourceName, QString origin, QString extensions, QString protocols, - QByteArray key) + QByteArray key, + QList<QPair<QString, QString> > headers) { QStringList handshakeRequest; if (resourceName.contains(QStringLiteral("\r\n"))) { @@ -1202,6 +1217,12 @@ QString QWebSocketPrivate::createHandShakeRequest(QString resourceName, handshakeRequest << QStringLiteral("Sec-WebSocket-Extensions: ") % extensions; if (protocols.length() > 0) handshakeRequest << QStringLiteral("Sec-WebSocket-Protocol: ") % protocols; + + QListIterator<QPair<QString, QString> > headerIter(headers); + while (headerIter.hasNext()) { + const QPair<QString,QString> &header = headerIter.next(); + handshakeRequest << header.first % QStringLiteral(": ") % header.second; + } handshakeRequest << QStringLiteral("\r\n"); return handshakeRequest.join(QStringLiteral("\r\n")); diff --git a/src/websockets/qwebsocket_p.h b/src/websockets/qwebsocket_p.h index 99acad2..037df61 100644 --- a/src/websockets/qwebsocket_p.h +++ b/src/websockets/qwebsocket_p.h @@ -126,7 +126,7 @@ public: QWebSocketProtocol::Version version() const; QString resourceName() const; - QUrl requestUrl() const; + QNetworkRequest request() const; QString origin() const; QString protocol() const; QString extension() const; @@ -145,7 +145,7 @@ public: void closeGoingAway(); void close(QWebSocketProtocol::CloseCode closeCode, QString reason); - void open(const QUrl &url, bool mask); + void open(const QNetworkRequest &request, bool mask); void ping(const QByteArray &payload); QWebSocket * const q_ptr; @@ -155,7 +155,7 @@ private: QWebSocket *pWebSocket); void setVersion(QWebSocketProtocol::Version version); void setResourceName(const QString &resourceName); - void setRequestUrl(const QUrl &requestUrl); + void setRequest(const QNetworkRequest &request); void setOrigin(const QString &origin); void setProtocol(const QString &protocol); void setExtension(const QString &extension); @@ -185,7 +185,8 @@ private: QString origin, QString extensions, QString protocols, - QByteArray key); + QByteArray key, + QList<QPair<QString, QString> > headers); static QWebSocket *upgradeFrom(QTcpSocket *tcpSocket, const QWebSocketHandshakeRequest &request, @@ -202,7 +203,7 @@ private: QWebSocketProtocol::Version m_version; QUrl m_resource; QString m_resourceName; - QUrl m_requestUrl; + QNetworkRequest m_request; QString m_origin; QString m_protocol; QString m_extension; diff --git a/src/websockets/qwebsocketframe.cpp b/src/websockets/qwebsocketframe.cpp index d533921..b76fa5c 100644 --- a/src/websockets/qwebsocketframe.cpp +++ b/src/websockets/qwebsocketframe.cpp @@ -61,14 +61,14 @@ QT_BEGIN_NAMESPACE QWebSocketFrame::QWebSocketFrame() : m_closeCode(QWebSocketProtocol::CloseCodeNormal), m_closeReason(), - m_isFinalFrame(true), m_mask(0), - m_rsv1(0), - m_rsv2(0), - m_rsv3(0), m_opCode(QWebSocketProtocol::OpCodeReservedC), m_length(0), m_payload(), + m_isFinalFrame(true), + m_rsv1(false), + m_rsv2(false), + m_rsv3(false), m_isValid(false) { } @@ -79,14 +79,14 @@ QWebSocketFrame::QWebSocketFrame() : QWebSocketFrame::QWebSocketFrame(const QWebSocketFrame &other) : m_closeCode(other.m_closeCode), m_closeReason(other.m_closeReason), - m_isFinalFrame(other.m_isFinalFrame), m_mask(other.m_mask), - m_rsv1(other.m_rsv1), - m_rsv2(other.m_rsv2), - m_rsv3(other.m_rsv3), m_opCode(other.m_opCode), m_length(other.m_length), m_payload(other.m_payload), + m_isFinalFrame(other.m_isFinalFrame), + m_rsv1(other.m_rsv1), + m_rsv2(other.m_rsv2), + m_rsv3(other.m_rsv3), m_isValid(other.m_isValid) { } @@ -118,14 +118,14 @@ QWebSocketFrame &QWebSocketFrame::operator =(const QWebSocketFrame &other) QWebSocketFrame::QWebSocketFrame(QWebSocketFrame &&other) : m_closeCode(qMove(other.m_closeCode)), m_closeReason(qMove(other.m_closeReason)), - m_isFinalFrame(qMove(other.m_isFinalFrame)), m_mask(qMove(other.m_mask)), - m_rsv1(qMove(other.m_rsv1)), - m_rsv2(qMove(other.m_rsv2)), - m_rsv3(qMove(other.m_rsv3)), m_opCode(qMove(other.m_opCode)), m_length(qMove(other.m_length)), m_payload(qMove(other.m_payload)), + m_isFinalFrame(qMove(other.m_isFinalFrame)), + m_rsv1(qMove(other.m_rsv1)), + m_rsv2(qMove(other.m_rsv2)), + m_rsv3(qMove(other.m_rsv3)), m_isValid(qMove(other.m_isValid)) {} @@ -239,30 +239,6 @@ quint32 QWebSocketFrame::mask() const /*! \internal */ -int QWebSocketFrame::rsv1() const -{ - return m_rsv1; -} - -/*! - \internal - */ -int QWebSocketFrame::rsv2() const -{ - return m_rsv2; -} - -/*! - \internal - */ -int QWebSocketFrame::rsv3() const -{ - return m_rsv3; -} - -/*! - \internal - */ QWebSocketProtocol::OpCode QWebSocketFrame::opCode() const { return m_opCode; @@ -287,9 +263,9 @@ void QWebSocketFrame::clear() m_closeReason.clear(); m_isFinalFrame = true; m_mask = 0; - m_rsv1 = 0; - m_rsv2 = 0; - m_rsv3 = 0; + m_rsv1 = false; + m_rsv2 = false; + m_rsv3 = false; m_opCode = QWebSocketProtocol::OpCodeReservedC; m_length = 0; m_payload.clear(); diff --git a/src/websockets/qwebsocketframe_p.h b/src/websockets/qwebsocketframe_p.h index 131775b..46bc510 100644 --- a/src/websockets/qwebsocketframe_p.h +++ b/src/websockets/qwebsocketframe_p.h @@ -34,6 +34,17 @@ #ifndef QWEBSOCKETFRAME_P_H #define QWEBSOCKETFRAME_P_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include <QtCore/QString> #include <QtCore/QByteArray> #include <QtCore/QCoreApplication> @@ -75,9 +86,9 @@ public: bool isContinuationFrame() const; bool hasMask() const; quint32 mask() const; //returns 0 if no mask - int rsv1() const; - int rsv2() const; - int rsv3() const; + inline bool rsv1() const { return m_rsv1; } + inline bool rsv2() const { return m_rsv2; } + inline bool rsv3() const { return m_rsv3; } QWebSocketProtocol::OpCode opCode() const; QByteArray payload() const; @@ -90,16 +101,15 @@ public: private: QWebSocketProtocol::CloseCode m_closeCode; QString m_closeReason; - bool m_isFinalFrame; quint32 m_mask; - int m_rsv1; - int m_rsv2; - int m_rsv3; QWebSocketProtocol::OpCode m_opCode; - quint8 m_length; QByteArray m_payload; + bool m_isFinalFrame; + bool m_rsv1; + bool m_rsv2; + bool m_rsv3; bool m_isValid; enum ProcessingState diff --git a/src/websockets/qwebsockethandshakeresponse.cpp b/src/websockets/qwebsockethandshakeresponse.cpp index 86e98a2..2595551 100644 --- a/src/websockets/qwebsockethandshakeresponse.cpp +++ b/src/websockets/qwebsockethandshakeresponse.cpp @@ -201,7 +201,7 @@ QString QWebSocketHandshakeResponse::getHandshakeResponse( if (Q_UNLIKELY(!m_canUpgrade)) { response << QStringLiteral("HTTP/1.1 400 Bad Request"); QStringList versions; - Q_FOREACH (const QWebSocketProtocol::Version &version, supportedVersions) + Q_FOREACH (QWebSocketProtocol::Version version, supportedVersions) versions << QString::number(static_cast<int>(version)); response << QStringLiteral("Sec-WebSocket-Version: ") % versions.join(QStringLiteral(", ")); diff --git a/src/websockets/qwebsocketprotocol_p.h b/src/websockets/qwebsocketprotocol_p.h index bf56332..9aab8ce 100644 --- a/src/websockets/qwebsocketprotocol_p.h +++ b/src/websockets/qwebsocketprotocol_p.h @@ -34,6 +34,17 @@ #ifndef QWEBSOCKETPROTOCOL_P_H #define QWEBSOCKETPROTOCOL_P_H +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + #include <QtCore/qglobal.h> #include "QtWebSockets/qwebsocketprotocol.h" diff --git a/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp b/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp index 660d8eb..c1dd9a1 100644 --- a/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp +++ b/tests/auto/websockets/dataprocessor/tst_dataprocessor.cpp @@ -329,7 +329,7 @@ void tst_DataProcessor::goodTextFrame_data() //error C2308: concatenating mismatched strings QTest::newRow((QStringLiteral("Text frame containing Hello-") + QStringLiteral("\xC2\xB5\x40\xC3\x9F\xC3\xB6\xC3\xA4\xC3\xBC\xC3\xA0") + - QStringLiteral("\xC3\xA1-UTF-8!!")).toLatin1().constData()) + QStringLiteral("\xC3\xA1-UTF-8!!")).toUtf8().constData()) << QByteArray::fromHex("48656c6c6f2dc2b540c39fc3b6c3a4c3bcc3a0c3a12d5554462d382121") << 22; } diff --git a/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp b/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp index 80bf19a..3ac47c4 100644 --- a/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp +++ b/tests/auto/websockets/qwebsocket/tst_qwebsocket.cpp @@ -52,6 +52,7 @@ public: Q_SIGNALS: void newConnection(QUrl requestUrl); + void newConnection(QNetworkRequest request); private Q_SLOTS: void onNewConnection(); @@ -87,6 +88,7 @@ void EchoServer::onNewConnection() QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection(); Q_EMIT newConnection(pSocket->requestUrl()); + Q_EMIT newConnection(pSocket->request()); connect(pSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(processTextMessage(QString))); connect(pSocket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(processBinaryMessage(QByteArray))); @@ -140,6 +142,7 @@ private Q_SLOTS: void tst_sendTextMessage(); void tst_sendBinaryMessage(); void tst_errorString(); + void tst_openRequest(); void tst_moveToThread(); void tst_moveToThreadNoWarning(); #ifndef QT_NO_NETWORKPROXY @@ -427,11 +430,9 @@ void tst_QWebSocket::tst_sendTextMessage() socket.open(url); - if (socketConnectedSpy.count() == 0) - QVERIFY(socketConnectedSpy.wait(500)); + QTRY_COMPARE(socketConnectedSpy.count(), 1); 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); @@ -463,8 +464,7 @@ void tst_QWebSocket::tst_sendTextMessage() socket.open(QUrl(QStringLiteral("ws://") + echoServer.hostAddress().toString() + QStringLiteral(":") + QString::number(echoServer.port()))); - if (socketConnectedSpy.count() == 0) - QVERIFY(socketConnectedSpy.wait(500)); + QTRY_COMPARE(socketConnectedSpy.count(), 1); QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); socket.sendTextMessage(QStringLiteral("Hello world!")); @@ -508,8 +508,7 @@ void tst_QWebSocket::tst_sendBinaryMessage() socket.open(QUrl(QStringLiteral("ws://") + echoServer.hostAddress().toString() + QStringLiteral(":") + QString::number(echoServer.port()))); - if (socketConnectedSpy.count() == 0) - QVERIFY(socketConnectedSpy.wait(500)); + QTRY_COMPARE(socketConnectedSpy.count(), 1); QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); socket.sendBinaryMessage(QByteArrayLiteral("Hello world!")); @@ -539,8 +538,7 @@ void tst_QWebSocket::tst_sendBinaryMessage() socket.open(QUrl(QStringLiteral("ws://") + echoServer.hostAddress().toString() + QStringLiteral(":") + QString::number(echoServer.port()))); - if (socketConnectedSpy.count() == 0) - QVERIFY(socketConnectedSpy.wait(500)); + QTRY_COMPARE(socketConnectedSpy.count(), 1); QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); socket.sendBinaryMessage(QByteArrayLiteral("Hello world!")); @@ -573,9 +571,7 @@ void tst_QWebSocket::tst_errorString() socket.open(QUrl(QStringLiteral("ws://someserver.on.mars:9999"))); - if (errorSpy.count() == 0) - errorSpy.wait(500); - QCOMPARE(errorSpy.count(), 1); + QTRY_COMPARE(errorSpy.count(), 1); QList<QVariant> arguments = errorSpy.takeFirst(); QAbstractSocket::SocketError socketError = qvariant_cast<QAbstractSocket::SocketError>(arguments.at(0)); @@ -583,6 +579,32 @@ void tst_QWebSocket::tst_errorString() QCOMPARE(socket.errorString(), QStringLiteral("Host not found")); } +void tst_QWebSocket::tst_openRequest() +{ + EchoServer echoServer; + + QWebSocket socket; + + QSignalSpy socketConnectedSpy(&socket, SIGNAL(connected())); + QSignalSpy serverRequestSpy(&echoServer, SIGNAL(newConnection(QNetworkRequest))); + + QUrl url = QUrl(QStringLiteral("ws://") + echoServer.hostAddress().toString() + + QLatin1Char(':') + QString::number(echoServer.port())); + url.addQueryItem("queryitem", "with encoded characters"); + QNetworkRequest req(url); + req.setRawHeader("X-Custom-Header", "A custom header"); + socket.open(req); + + QTRY_COMPARE(socketConnectedSpy.count(), 1); + QTRY_COMPARE(serverRequestSpy.count(), 1); + QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); + QList<QVariant> arguments = serverRequestSpy.takeFirst(); + QNetworkRequest requestConnected = arguments.at(0).value<QNetworkRequest>(); + QCOMPARE(requestConnected.url(), req.url()); + QCOMPARE(requestConnected.rawHeader("X-Custom-Header"), req.rawHeader("X-Custom-Header")); + socket.close(); +} + class WebSocket : public QWebSocket { Q_OBJECT diff --git a/tests/auto/websockets/websocketframe/tst_websocketframe.cpp b/tests/auto/websockets/websocketframe/tst_websocketframe.cpp index 5db82d5..ecfcf3b 100644 --- a/tests/auto/websockets/websocketframe/tst_websocketframe.cpp +++ b/tests/auto/websockets/websocketframe/tst_websocketframe.cpp @@ -244,9 +244,9 @@ void tst_WebSocketFrame::tst_copyConstructorAndAssignment() void tst_WebSocketFrame::tst_goodFrames_data() { - QTest::addColumn<int>("rsv1"); - QTest::addColumn<int>("rsv2"); - QTest::addColumn<int>("rsv3"); + QTest::addColumn<bool>("rsv1"); + QTest::addColumn<bool>("rsv2"); + QTest::addColumn<bool>("rsv3"); QTest::addColumn<quint32>("mask"); QTest::addColumn<QWebSocketProtocol::OpCode>("opCode"); QTest::addColumn<bool>("isFinal"); @@ -256,54 +256,54 @@ void tst_WebSocketFrame::tst_goodFrames_data() QTest::addColumn<bool>("isContinuationFrame"); QTest::newRow("Non masked final text frame with small payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeText << true << QStringLiteral("Hello world!").toUtf8() << false << true << false; QTest::newRow("Non masked final binary frame with small payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeBinary << true << QByteArrayLiteral("\x00\x01\x02\x03\x04") << false << true << false; QTest::newRow("Non masked final text frame with no payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeText << true << QByteArray() << false << true << false; QTest::newRow("Non masked final binary frame with no payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeBinary << true << QByteArray() << false << true << false; QTest::newRow("Non masked final close frame with small payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeClose << true << QStringLiteral("Hello world!").toUtf8() << true << false << false; QTest::newRow("Non masked final close frame with no payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeClose << true << QByteArray() << true << false << false; QTest::newRow("Non masked final ping frame with small payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodePing << true << QStringLiteral("Hello world!").toUtf8() << true << false << false; QTest::newRow("Non masked final pong frame with no payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodePong << true << QByteArray() << true << false << false; QTest::newRow("Non masked final continuation frame with small payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeContinue << true << QStringLiteral("Hello world!").toUtf8() << false << true << true; QTest::newRow("Non masked non-final continuation frame with small payload") - << 0 << 0 << 0 + << false << false << false << 0U << QWebSocketProtocol::OpCodeContinue << false << QStringLiteral("Hello world!").toUtf8() << false << true << true; @@ -311,9 +311,9 @@ void tst_WebSocketFrame::tst_goodFrames_data() void tst_WebSocketFrame::tst_goodFrames() { - QFETCH(int, rsv1); - QFETCH(int, rsv2); - QFETCH(int, rsv3); + QFETCH(bool, rsv1); + QFETCH(bool, rsv2); + QFETCH(bool, rsv3); QFETCH(quint32, mask); QFETCH(QWebSocketProtocol::OpCode, opCode); QFETCH(bool, isFinal); |