summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilian Wolff <mail@milianw.de>2014-03-21 16:10:09 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-06-08 15:40:31 +0200
commitdb645f9178716a61ba4caeef0dade292460967ef (patch)
tree6d23e8b6e88859b631845929a6e825a059b39638
parent6bd414a1f74f5a0ebfc1f4abcc140f7b3b536e1b (diff)
downloadqtwebsockets-db645f9178716a61ba4caeef0dade292460967ef.tar.gz
Add a QUrl serverUrl method to QWebSocketServer.
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>
-rw-r--r--src/websockets/qwebsocketserver.cpp38
-rw-r--r--src/websockets/qwebsocketserver.h1
-rw-r--r--tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp16
3 files changed, 47 insertions, 8 deletions
diff --git a/src/websockets/qwebsocketserver.cpp b/src/websockets/qwebsocketserver.cpp
index 20aa009..2d8f26b 100644
--- a/src/websockets/qwebsocketserver.cpp
+++ b/src/websockets/qwebsocketserver.cpp
@@ -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.
diff --git a/src/websockets/qwebsocketserver.h b/src/websockets/qwebsocketserver.h
index 1f89ca9..4e76cd4 100644
--- a/src/websockets/qwebsocketserver.h
+++ b/src/websockets/qwebsocketserver.h
@@ -90,6 +90,7 @@ public:
quint16 serverPort() const;
QHostAddress serverAddress() const;
+ QUrl serverUrl() const;
SslMode secureMode() const;
diff --git a/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp b/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp
index 2e2dcd6..78e7041 100644
--- a/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp
+++ b/tests/auto/qwebsocketserver/tst_qwebsocketserver.cpp
@@ -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);