From 220ad189a04128e1926182b6170e1f46d1cbd6bf Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 21 Aug 2015 14:16:34 -0700 Subject: [PATCH 1/5] force the HTTPManager to listen on IPv4 --- .../embedded-webserver/src/HTTPManager.cpp | 27 ++++++------------- .../embedded-webserver/src/HTTPManager.h | 7 ----- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/libraries/embedded-webserver/src/HTTPManager.cpp b/libraries/embedded-webserver/src/HTTPManager.cpp index 72436fc55e..946da00a34 100644 --- a/libraries/embedded-webserver/src/HTTPManager.cpp +++ b/libraries/embedded-webserver/src/HTTPManager.cpp @@ -29,10 +29,14 @@ HTTPManager::HTTPManager(quint16 port, const QString& documentRoot, HTTPRequestH _requestHandler(requestHandler), _port(port) { - bindSocket(); - _isListeningTimer = new QTimer(this); - connect(_isListeningTimer, &QTimer::timeout, this, &HTTPManager::isTcpServerListening); - _isListeningTimer->start(SOCKET_CHECK_INTERVAL_IN_MS); + qCDebug(embeddedwebserver) << "Attempting to bind TCP socket on port " << QString::number(_port); + + if (listen(QHostAddress::AnyIPv4, _port)) { + qCDebug(embeddedwebserver) << "TCP socket is listening on" << serverAddress() << "and port" << serverPort(); + } else { + qCritical() << "Failed to open HTTP server socket:" << errorString() << " - forcing exit."; + QCoreApplication::exit(SOCKET_ERROR_EXIT_CODE); + } } void HTTPManager::incomingConnection(qintptr socketDescriptor) { @@ -162,18 +166,3 @@ bool HTTPManager::requestHandledByRequestHandler(HTTPConnection* connection, con return _requestHandler && _requestHandler->handleHTTPRequest(connection, url); } -void HTTPManager::isTcpServerListening() { - if (!isListening()) { - qCWarning(embeddedwebserver) << "Socket on port " << QString::number(_port) << " is no longer listening"; - bindSocket(); - } -} - -bool HTTPManager::bindSocket() { - qCDebug(embeddedwebserver) << "Attempting to bind TCP socket on port " << QString::number(_port); - if (!listen(QHostAddress::Any, _port)) { - qCritical() << "Failed to open HTTP server socket:" << errorString() << " can't continue"; - QCoreApplication::exit(SOCKET_ERROR_EXIT_CODE); - } - return true; -} \ No newline at end of file diff --git a/libraries/embedded-webserver/src/HTTPManager.h b/libraries/embedded-webserver/src/HTTPManager.h index 6375b10205..8e1780a631 100644 --- a/libraries/embedded-webserver/src/HTTPManager.h +++ b/libraries/embedded-webserver/src/HTTPManager.h @@ -37,12 +37,6 @@ public: bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); -private slots: - void isTcpServerListening(); - -private: - bool bindSocket(); - protected: /// Accepts all pending connections virtual void incomingConnection(qintptr socketDescriptor); @@ -50,7 +44,6 @@ protected: QString _documentRoot; HTTPRequestHandler* _requestHandler; - QTimer* _isListeningTimer; const quint16 _port; }; From 34b3fb1c0c7e2230b55f8f9afee889ecf9be5512 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 21 Aug 2015 14:27:17 -0700 Subject: [PATCH 2/5] Revert "force the HTTPManager to listen on IPv4" This reverts commit 220ad189a04128e1926182b6170e1f46d1cbd6bf. --- .../embedded-webserver/src/HTTPManager.cpp | 27 +++++++++++++------ .../embedded-webserver/src/HTTPManager.h | 7 +++++ 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/libraries/embedded-webserver/src/HTTPManager.cpp b/libraries/embedded-webserver/src/HTTPManager.cpp index 946da00a34..72436fc55e 100644 --- a/libraries/embedded-webserver/src/HTTPManager.cpp +++ b/libraries/embedded-webserver/src/HTTPManager.cpp @@ -29,14 +29,10 @@ HTTPManager::HTTPManager(quint16 port, const QString& documentRoot, HTTPRequestH _requestHandler(requestHandler), _port(port) { - qCDebug(embeddedwebserver) << "Attempting to bind TCP socket on port " << QString::number(_port); - - if (listen(QHostAddress::AnyIPv4, _port)) { - qCDebug(embeddedwebserver) << "TCP socket is listening on" << serverAddress() << "and port" << serverPort(); - } else { - qCritical() << "Failed to open HTTP server socket:" << errorString() << " - forcing exit."; - QCoreApplication::exit(SOCKET_ERROR_EXIT_CODE); - } + bindSocket(); + _isListeningTimer = new QTimer(this); + connect(_isListeningTimer, &QTimer::timeout, this, &HTTPManager::isTcpServerListening); + _isListeningTimer->start(SOCKET_CHECK_INTERVAL_IN_MS); } void HTTPManager::incomingConnection(qintptr socketDescriptor) { @@ -166,3 +162,18 @@ bool HTTPManager::requestHandledByRequestHandler(HTTPConnection* connection, con return _requestHandler && _requestHandler->handleHTTPRequest(connection, url); } +void HTTPManager::isTcpServerListening() { + if (!isListening()) { + qCWarning(embeddedwebserver) << "Socket on port " << QString::number(_port) << " is no longer listening"; + bindSocket(); + } +} + +bool HTTPManager::bindSocket() { + qCDebug(embeddedwebserver) << "Attempting to bind TCP socket on port " << QString::number(_port); + if (!listen(QHostAddress::Any, _port)) { + qCritical() << "Failed to open HTTP server socket:" << errorString() << " can't continue"; + QCoreApplication::exit(SOCKET_ERROR_EXIT_CODE); + } + return true; +} \ No newline at end of file diff --git a/libraries/embedded-webserver/src/HTTPManager.h b/libraries/embedded-webserver/src/HTTPManager.h index 8e1780a631..6375b10205 100644 --- a/libraries/embedded-webserver/src/HTTPManager.h +++ b/libraries/embedded-webserver/src/HTTPManager.h @@ -37,6 +37,12 @@ public: bool handleHTTPRequest(HTTPConnection* connection, const QUrl& url, bool skipSubHandler = false); +private slots: + void isTcpServerListening(); + +private: + bool bindSocket(); + protected: /// Accepts all pending connections virtual void incomingConnection(qintptr socketDescriptor); @@ -44,6 +50,7 @@ protected: QString _documentRoot; HTTPRequestHandler* _requestHandler; + QTimer* _isListeningTimer; const quint16 _port; }; From 3e4a05a57bf7284537065288605f8ad597f6b226 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 21 Aug 2015 14:30:41 -0700 Subject: [PATCH 3/5] leave the listen check but queue Application quit --- .../embedded-webserver/src/HTTPManager.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libraries/embedded-webserver/src/HTTPManager.cpp b/libraries/embedded-webserver/src/HTTPManager.cpp index 72436fc55e..4498d619cd 100644 --- a/libraries/embedded-webserver/src/HTTPManager.cpp +++ b/libraries/embedded-webserver/src/HTTPManager.cpp @@ -20,7 +20,6 @@ #include "EmbeddedWebserverLogging.h" #include "HTTPManager.h" -const int SOCKET_ERROR_EXIT_CODE = 2; const int SOCKET_CHECK_INTERVAL_IN_MS = 30000; HTTPManager::HTTPManager(quint16 port, const QString& documentRoot, HTTPRequestHandler* requestHandler, QObject* parent) : @@ -30,6 +29,7 @@ HTTPManager::HTTPManager(quint16 port, const QString& documentRoot, HTTPRequestH _port(port) { bindSocket(); + _isListeningTimer = new QTimer(this); connect(_isListeningTimer, &QTimer::timeout, this, &HTTPManager::isTcpServerListening); _isListeningTimer->start(SOCKET_CHECK_INTERVAL_IN_MS); @@ -171,9 +171,16 @@ void HTTPManager::isTcpServerListening() { bool HTTPManager::bindSocket() { qCDebug(embeddedwebserver) << "Attempting to bind TCP socket on port " << QString::number(_port); - if (!listen(QHostAddress::Any, _port)) { + + if (listen(QHostAddress::AnyIPv4, _port)) { + qCDebug(embeddedwebserver) << "TCP socket is listening on" << serverAddress() << "and port" << serverPort(); + + return true; + } else { qCritical() << "Failed to open HTTP server socket:" << errorString() << " can't continue"; - QCoreApplication::exit(SOCKET_ERROR_EXIT_CODE); + QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection); + + return false; } - return true; -} \ No newline at end of file + +} From 0fbbfb77d1d66df91e5130613e5fec1b6606129b Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 21 Aug 2015 14:42:03 -0700 Subject: [PATCH 4/5] exit with a code to indicate error --- libraries/embedded-webserver/src/HTTPManager.cpp | 10 +++++++--- libraries/embedded-webserver/src/HTTPManager.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/libraries/embedded-webserver/src/HTTPManager.cpp b/libraries/embedded-webserver/src/HTTPManager.cpp index 4498d619cd..525caf8f3c 100644 --- a/libraries/embedded-webserver/src/HTTPManager.cpp +++ b/libraries/embedded-webserver/src/HTTPManager.cpp @@ -20,6 +20,7 @@ #include "EmbeddedWebserverLogging.h" #include "HTTPManager.h" +const int SOCKET_ERROR_EXIT_CODE = 2; const int SOCKET_CHECK_INTERVAL_IN_MS = 30000; HTTPManager::HTTPManager(quint16 port, const QString& documentRoot, HTTPRequestHandler* requestHandler, QObject* parent) : @@ -172,15 +173,18 @@ void HTTPManager::isTcpServerListening() { bool HTTPManager::bindSocket() { qCDebug(embeddedwebserver) << "Attempting to bind TCP socket on port " << QString::number(_port); - if (listen(QHostAddress::AnyIPv4, _port)) { + if (false) { qCDebug(embeddedwebserver) << "TCP socket is listening on" << serverAddress() << "and port" << serverPort(); return true; } else { qCritical() << "Failed to open HTTP server socket:" << errorString() << " can't continue"; - QMetaObject::invokeMethod(QCoreApplication::instance(), "quit", Qt::QueuedConnection); + QMetaObject::invokeMethod(this, "queuedExit", Qt::QueuedConnection); return false; } - +} + +void HTTPManager::queuedExit() { + QCoreApplication::exit(SOCKET_ERROR_EXIT_CODE); } diff --git a/libraries/embedded-webserver/src/HTTPManager.h b/libraries/embedded-webserver/src/HTTPManager.h index 6375b10205..03498fbe8d 100644 --- a/libraries/embedded-webserver/src/HTTPManager.h +++ b/libraries/embedded-webserver/src/HTTPManager.h @@ -39,6 +39,7 @@ public: private slots: void isTcpServerListening(); + void queuedExit(); private: bool bindSocket(); From 4b95d54955f0264b826cf6a3ca4cc9c7dc29ad84 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Fri, 21 Aug 2015 14:55:24 -0700 Subject: [PATCH 5/5] remove the explicit failure test --- libraries/embedded-webserver/src/HTTPManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/embedded-webserver/src/HTTPManager.cpp b/libraries/embedded-webserver/src/HTTPManager.cpp index 525caf8f3c..1f1dfa1735 100644 --- a/libraries/embedded-webserver/src/HTTPManager.cpp +++ b/libraries/embedded-webserver/src/HTTPManager.cpp @@ -173,7 +173,7 @@ void HTTPManager::isTcpServerListening() { bool HTTPManager::bindSocket() { qCDebug(embeddedwebserver) << "Attempting to bind TCP socket on port " << QString::number(_port); - if (false) { + if (listen(QHostAddress::AnyIPv4, _port)) { qCDebug(embeddedwebserver) << "TCP socket is listening on" << serverAddress() << "and port" << serverPort(); return true;