From c4f792bd4044cdc92a7f09ed29760c3c837374ab Mon Sep 17 00:00:00 2001 From: Felix Kauselmann Date: Wed, 25 Nov 2020 21:12:16 +0100 Subject: [PATCH] Fix port settings When setting ports, temporary or for good, we need to go via the config files and not QTcpServer or we get undefined behavior. To support temp ports, we need to back up the fixed port in the settings. --- YACReaderLibrary/server/startup.cpp | 44 +++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/YACReaderLibrary/server/startup.cpp b/YACReaderLibrary/server/startup.cpp index 93781a1c..5afa00d0 100644 --- a/YACReaderLibrary/server/startup.cpp +++ b/YACReaderLibrary/server/startup.cpp @@ -110,20 +110,42 @@ void Startup::start(quint16 port) if (listenerSettings->value("minThreads").isNull()) listenerSettings->setValue("minThreads", 50); + if (listenerSettings->value("port").isNull()) + listenerSettings->setValue("port", 8080); + + // start with a temporary port + if (port != 0) { + // cache saved port + if (!listenerSettings->contains("cachedPort")) { + listenerSettings->setValue("cachedPort", listenerSettings->value("port").toInt()); + } + listenerSettings->setValue("port", port); + } else { + // restore saved port + if (listenerSettings->contains("cachedPort")) { + listenerSettings->setValue("port", listenerSettings->value("cachedPort")); + listenerSettings->remove("cachedPort"); + } + } + // test if port is working + { + QTcpServer testServer; + if (!testServer.listen(QHostAddress::Any, listenerSettings->value("port").toInt())) { + qDebug("Port is busy."); + // get random port + testServer.listen(QHostAddress::Any, 0); + listenerSettings->setValue("port", testServer.serverPort()); + } + testServer.close(); + } + listener = new HttpListener(listenerSettings, new RequestMapper(app), app); - if (port != 0) { - if (listener->isListening()) { - listener->close(); - } - listener->QTcpServer::listen(QHostAddress::Any, port); + if (listener->isListening()) { + qDebug("ServiceHelper: Service has started"); + } else { + qDebug("ServiceHelper: Could not launch service"); } - // if the requested port is busy, use random port - if (!listener->isListening()) { - listener->QTcpServer::listen(QHostAddress::Any, 0); - } - - qDebug("ServiceHelper: Service has started"); } void Startup::stop()