Add a QUrl serverUrl method to QWebSocketServer.
authorMilian Wolff <mail@milianw.de>
Fri, 21 Mar 2014 15:10:09 +0000 (16:10 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Sun, 8 Jun 2014 13:40:31 +0000 (15:40 +0200)
It is useful in many places, esp. when constructing clients that
should connect to the server we created.

Note that the returned host address will be LocalHost instead of Any,
to make sure clients can connect to the server even on Windows.
This should hopefully resolve the CI issues.

Change-Id: I3c400ad4d785ea398cf1a1bd113c0833fda9e3bd
Reviewed-by: Kurt Pattyn <pattyn.kurt@gmail.com>
src/websockets/qwebsocketserver.cpp
src/websockets/qwebsocketserver.h
tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp

index 20aa009..2d8f26b 100644 (file)
@@ -495,6 +495,44 @@ quint16 QWebSocketServer::serverPort() const
 }
 
 /*!
+    Returns a URL clients can use to connect to this server if the server is listening for connections.
+    Otherwise an invalid URL is returned.
+
+    \sa serverPort(), serverAddress(), listen()
+ */
+QUrl QWebSocketServer::serverUrl() const
+{
+    QUrl url;
+
+    if (!isListening()) {
+        return url;
+    }
+
+    switch (secureMode()) {
+    case NonSecureMode:
+        url.setScheme(QStringLiteral("ws"));
+        break;
+    #ifndef QT_NO_SSL
+    case SecureMode:
+        url.setScheme(QStringLiteral("wss"));
+        break;
+    #endif
+    }
+
+    url.setPort(serverPort());
+
+    if (serverAddress() == QHostAddress(QHostAddress::Any)) {
+        // NOTE: On Windows at least, clients cannot connect to QHostAddress::Any
+        // so in that case we always return LocalHost instead.
+        url.setHost(QHostAddress(QHostAddress::LocalHost).toString());
+    } else {
+        url.setHost(serverAddress().toString());
+    }
+
+    return url;
+}
+
+/*!
     Sets the maximum number of pending accepted connections to \a numConnections.
     WebSocketServer will accept no more than \a numConnections incoming connections before
     nextPendingConnection() is called.
index 1f89ca9..4e76cd4 100644 (file)
@@ -90,6 +90,7 @@ public:
 
     quint16 serverPort() const;
     QHostAddress serverAddress() const;
+    QUrl serverUrl() const;
 
     SslMode secureMode() const;
 
index 2e2dcd6..78e7041 100644 (file)
@@ -147,6 +147,7 @@ void tst_QWebSocketServer::tst_initialisation()
         QCOMPARE(server.supportedVersions().count(), 1);
         QCOMPARE(server.supportedVersions().at(0), QWebSocketProtocol::VersionLatest);
         QCOMPARE(server.supportedVersions().at(0), QWebSocketProtocol::Version13);
+        QCOMPARE(server.serverUrl(), QUrl());
     }
 
     {
@@ -254,9 +255,11 @@ void tst_QWebSocketServer::tst_connectivity()
     QSignalSpy socketConnectedSpy(&socket, SIGNAL(connected()));
 
     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(QStringLiteral("ws://") + QHostAddress(QHostAddress::LocalHost).toString() +
-                QStringLiteral(":").append(QString::number(server.serverPort())));
+    socket.open(server.serverUrl().toString());
 
     if (socketConnectedSpy.count() == 0)
         QVERIFY(socketConnectedSpy.wait());
@@ -305,23 +308,20 @@ void tst_QWebSocketServer::tst_maxPendingConnections()
 
     QVERIFY(server.listen());
 
-    socket1.open(QStringLiteral("ws://") + QHostAddress(QHostAddress::LocalHost).toString() +
-                 QStringLiteral(":").append(QString::number(server.serverPort())));
+    socket1.open(server.serverUrl().toString());
 
     if (socket1ConnectedSpy.count() == 0)
         QVERIFY(socket1ConnectedSpy.wait());
     QCOMPARE(socket1.state(), QAbstractSocket::ConnectedState);
     QCOMPARE(serverConnectionSpy.count(), 1);
     QCOMPARE(corsAuthenticationSpy.count(), 1);
-    socket2.open(QStringLiteral("ws://") + QHostAddress(QHostAddress::LocalHost).toString() +
-                 QStringLiteral(":").append(QString::number(server.serverPort())));
+    socket2.open(server.serverUrl().toString());
     if (socket2ConnectedSpy.count() == 0)
         QVERIFY(socket2ConnectedSpy.wait());
     QCOMPARE(socket2.state(), QAbstractSocket::ConnectedState);
     QCOMPARE(serverConnectionSpy.count(), 2);
     QCOMPARE(corsAuthenticationSpy.count(), 2);
-    socket3.open(QStringLiteral("ws://") + server.serverAddress().toString() +
-                 QStringLiteral(":").append(QString::number(server.serverPort())));
+    socket3.open(server.serverUrl().toString());
     if (socket3ConnectedSpy.count() == 0)
         QVERIFY(!socket3ConnectedSpy.wait(250));
     QCOMPARE(socket3.state(), QAbstractSocket::UnconnectedState);