diff options
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/websockets/qwebsocket.cpp | 27 | ||||
-rw-r--r-- | src/websockets/qwebsocket.h | 3 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.cpp | 28 | ||||
-rw-r--r-- | src/websockets/qwebsocket_p.h | 8 | ||||
-rw-r--r-- | tests/auto/qwebsocket/tst_qwebsocket.cpp | 22 |
6 files changed, 70 insertions, 20 deletions
diff --git a/.qmake.conf b/.qmake.conf index 76fcbdf..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.0 +MODULE_VERSION = 5.6.0 diff --git a/src/websockets/qwebsocket.cpp b/src/websockets/qwebsocket.cpp index a77f23c..3d948a5 100644 --- a/src/websockets/qwebsocket.cpp +++ b/src/websockets/qwebsocket.cpp @@ -389,7 +389,20 @@ 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. + */ +void QWebSocket::open(const QNetworkRequest &request) +{ + Q_D(QWebSocket); + d->open(request, true); } /*! @@ -512,7 +525,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 c7a2d00..28c24ae 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(), @@ -281,9 +281,10 @@ QWebSocket *QWebSocketPrivate::upgradeFrom(QTcpSocket *pTcpSocket, { QWebSocket *pWebSocket = new QWebSocket(pTcpSocket, response.acceptedVersion(), parent); if (Q_LIKELY(pWebSocket)) { + QNetworkRequest netRequest(request.requestUrl()); 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 @@ -330,12 +331,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 //m_pSocket.reset(); 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); @@ -352,11 +354,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; @@ -479,10 +481,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; } /*! @@ -620,9 +622,9 @@ QString QWebSocketPrivate::resourceName() const /*! \internal */ -QUrl QWebSocketPrivate::requestUrl() const +QNetworkRequest QWebSocketPrivate::request() const { - return m_requestUrl; + return m_request; } /*! @@ -1044,9 +1046,9 @@ void QWebSocketPrivate::processStateChanged(QAbstractSocket::SocketState socketS m_key = generateKey(); const QString handshake = createHandShakeRequest(m_resourceName, - m_requestUrl.host() + m_request.url().host() % QStringLiteral(":") - % QString::number(m_requestUrl.port(80)), + % QString::number(m_request.url().port(80)), origin(), QString(), QString(), diff --git a/src/websockets/qwebsocket_p.h b/src/websockets/qwebsocket_p.h index 7379c51..615bcfc 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; @@ -144,7 +144,7 @@ public: #endif 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; @@ -154,7 +154,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); @@ -201,7 +201,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/tests/auto/qwebsocket/tst_qwebsocket.cpp b/tests/auto/qwebsocket/tst_qwebsocket.cpp index aca25d0..2422012 100644 --- a/tests/auto/qwebsocket/tst_qwebsocket.cpp +++ b/tests/auto/qwebsocket/tst_qwebsocket.cpp @@ -140,6 +140,7 @@ private Q_SLOTS: void tst_sendTextMessage(); void tst_sendBinaryMessage(); void tst_errorString(); + void tst_openRequest(); #ifndef QT_NO_NETWORKPROXY void tst_setProxy(); #endif @@ -581,6 +582,27 @@ 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())); + + QUrl url = QUrl(QStringLiteral("ws://") + echoServer.hostAddress().toString() + + QLatin1Char(':') + QString::number(echoServer.port())); + url.addQueryItem("queryitem", "with encoded characters"); + QNetworkRequest req(url); + socket.open(req); + + if (socketConnectedSpy.count() == 0) + QVERIFY(socketConnectedSpy.wait(500)); + QCOMPARE(socket.state(), QAbstractSocket::ConnectedState); + + socket.close(); +} + #ifndef QT_NO_NETWORKPROXY void tst_QWebSocket::tst_setProxy() { |