From becbbeba273efe933b89f12c1a92ba5a56bcc8a6 Mon Sep 17 00:00:00 2001 From: LordGrey <48840279+Lord-Grey@users.noreply.github.com> Date: Sat, 28 Dec 2024 14:05:23 +0100 Subject: [PATCH] Updates --- libsrc/webserver/QtHttpClientWrapper.cpp | 20 +++++++------ libsrc/webserver/QtHttpClientWrapper.h | 7 ++--- libsrc/webserver/QtHttpServer.h | 29 +++++++++--------- libsrc/webserver/WebSocketJsonHandler.cpp | 36 ++++++++++++++++------- libsrc/webserver/WebSocketJsonHandler.h | 3 ++ 5 files changed, 56 insertions(+), 39 deletions(-) diff --git a/libsrc/webserver/QtHttpClientWrapper.cpp b/libsrc/webserver/QtHttpClientWrapper.cpp index 9ace9448..b4182e63 100644 --- a/libsrc/webserver/QtHttpClientWrapper.cpp +++ b/libsrc/webserver/QtHttpClientWrapper.cpp @@ -27,10 +27,9 @@ QtHttpClientWrapper::QtHttpClientWrapper (QTcpSocket * sock, const bool& localCo , m_localConnection(localConnection) , m_websocketClient(nullptr) , m_webJsonRpc (nullptr) + , m_websocketServer (nullptr) { - connect (m_sockClient, &QTcpSocket::readyRead, this, &QtHttpClientWrapper::onClientDataReceived); - connect(&m_websocketServer, &QWebSocketServer::newConnection, - this, &QtHttpClientWrapper::onNewWebSocketConnection); + connect(m_sockClient, &QTcpSocket::readyRead, this, &QtHttpClientWrapper::onClientDataReceived); } QString QtHttpClientWrapper::getGuid (void) @@ -172,14 +171,19 @@ void QtHttpClientWrapper::onClientDataReceived (void) const auto& upgradeValue = m_currentRequest->getHeader(QtHttpHeader::Upgrade).toLower(); if (upgradeValue.compare(QByteArrayLiteral("websocket"), Qt::CaseInsensitive) == 0) { - qDebug() << "WebSocket upgrade detected, passing to QWebSocketServer"; - if(m_websocketClient == Q_NULLPTR) { // disconnect this slot from socket for further requests disconnect(m_sockClient, &QTcpSocket::readyRead, this, &QtHttpClientWrapper::onClientDataReceived); m_sockClient->rollbackTransaction(); - m_websocketServer.handleConnection(m_sockClient); + + QString servername = QCoreApplication::applicationName() + QLatin1Char('/') + HYPERION_VERSION; + QWebSocketServer::SslMode secureMode = m_serverHandle->isSecure() ? QWebSocketServer::SecureMode : QWebSocketServer::NonSecureMode; + m_websocketServer.reset(new QWebSocketServer(servername, secureMode)); + connect(m_websocketServer.get(), &QWebSocketServer::newConnection, + this, &QtHttpClientWrapper::onNewWebSocketConnection); + + m_websocketServer->handleConnection(m_sockClient); emit m_sockClient->readyRead(); return; } @@ -381,10 +385,8 @@ void QtHttpClientWrapper::closeConnection() void QtHttpClientWrapper::onNewWebSocketConnection() { // Handle the pending connection - QWebSocket* webSocket = m_websocketServer.nextPendingConnection(); + QWebSocket* webSocket = m_websocketServer->nextPendingConnection(); if (webSocket) { - qDebug() << "New WebSocket connection established"; - // Manage the WebSocketJsonHandler for this connection WebSocketJsonHandler* handler = new WebSocketJsonHandler(webSocket); connect(webSocket, &QWebSocket::disconnected, handler, &QObject::deleteLater); diff --git a/libsrc/webserver/QtHttpClientWrapper.h b/libsrc/webserver/QtHttpClientWrapper.h index 76632d2f..c0dedb62 100644 --- a/libsrc/webserver/QtHttpClientWrapper.h +++ b/libsrc/webserver/QtHttpClientWrapper.h @@ -5,6 +5,7 @@ #include #include #include +#include class QTcpSocket; @@ -41,11 +42,6 @@ public: /// void closeConnection(); - QWebSocketServer m_websocketServer{ - QCoreApplication::applicationName() + QLatin1Char('/') + QCoreApplication::applicationVersion(), - QWebSocketServer::NonSecureMode - }; - signals: void newWebSocketConnection(); @@ -70,6 +66,7 @@ private: WebSocketClient * m_websocketClient; WebJsonRpc * m_webJsonRpc; QByteArray m_fragment; + QScopedPointer m_websocketServer; }; #endif // QTHTTPCLIENTWRAPPER_H diff --git a/libsrc/webserver/QtHttpServer.h b/libsrc/webserver/QtHttpServer.h index 4e09c6d7..67e087e4 100644 --- a/libsrc/webserver/QtHttpServer.h +++ b/libsrc/webserver/QtHttpServer.h @@ -46,21 +46,22 @@ public: typedef void (QSslSocket::* SslErrorSignal) (const QList &); - const QString & getServerName (void) const { return m_serverName; }; + const QString & getServerName (void) const { return m_serverName; } - quint16 getServerPort (void) const { return m_sockServer->serverPort(); }; - QString getErrorString (void) const { return m_sockServer->errorString(); }; - bool isListening() { return m_sockServer->isListening(); }; + quint16 getServerPort (void) const { return m_sockServer->serverPort(); } + QString getErrorString (void) const { return m_sockServer->errorString(); } + bool isListening() { return m_sockServer->isListening(); } + bool isSecure() { return m_useSsl; } public slots: void start (quint16 port = 0); void stop (void); - void setUseSecure (const bool ssl = true); - void setServerName (const QString & serverName) { m_serverName = serverName; }; - void setPrivateKey (const QSslKey & key) { m_sslKey = key; }; - void setCertificates (const QList & certs) { m_sslCerts = certs; }; - QSslKey getPrivateKey() { return m_sslKey; }; - QList getCertificates() { return m_sslCerts; }; + void setUseSecure (bool ssl = true); + void setServerName (const QString & serverName) { m_serverName = serverName; } + void setPrivateKey (const QSslKey & key) { m_sslKey = key; } + void setCertificates (const QList & certs) { m_sslCerts = certs; } + QSslKey getPrivateKey() { return m_sslKey; } + QList getCertificates() { return m_sslCerts; } signals: void started (quint16 port); @@ -73,10 +74,10 @@ signals: private slots: void onClientConnected (void); void onClientDisconnected (void); - void onClientSslEncrypted (void) { }; - void onClientSslPeerVerifyError (const QSslError & err) { Q_UNUSED (err) }; - void onClientSslErrors (const QList & errors) { Q_UNUSED (errors) }; - void onClientSslModeChanged (QSslSocket::SslMode mode) { Q_UNUSED (mode) }; + void onClientSslEncrypted (void) { } + void onClientSslPeerVerifyError (const QSslError & err) { Q_UNUSED (err) } + void onClientSslErrors (const QList & errors) { Q_UNUSED (errors) } + void onClientSslModeChanged (QSslSocket::SslMode mode) { Q_UNUSED (mode) } private: bool m_useSsl; diff --git a/libsrc/webserver/WebSocketJsonHandler.cpp b/libsrc/webserver/WebSocketJsonHandler.cpp index b0c8beb1..34beeebf 100644 --- a/libsrc/webserver/WebSocketJsonHandler.cpp +++ b/libsrc/webserver/WebSocketJsonHandler.cpp @@ -5,21 +5,26 @@ #include #include +#define NO_TRACE_SEND +#define NO_TRACE_RECEIVE + WebSocketJsonHandler::WebSocketJsonHandler(QWebSocket* websocket, QObject* parent) : QObject(parent) , _websocket(websocket) , _log(Logger::getInstance("WEBSOCKET")) { connect(_websocket, &QWebSocket::textMessageReceived, this, &WebSocketJsonHandler::onTextMessageReceived); + connect(_websocket, &QWebSocket::binaryMessageReceived, this, &WebSocketJsonHandler::onBinaryMessageReceived); connect(_websocket, &QWebSocket::disconnected, this, &WebSocketJsonHandler::onDisconnected); - const QString client = _websocket->peerAddress().toString(); - Debug(_log, "New WebSocket connection from %s", QSTRING_CSTR(client)); + _peerAddress = _websocket->peerAddress().toString(); + _origin = websocket->origin(); + Debug(_log, "New WebSocket connection from %s initiated via: %s", QSTRING_CSTR(_peerAddress), QSTRING_CSTR(_origin)); bool localConnection = NetOrigin::getInstance()->isLocalAddress(_websocket->peerAddress(), _websocket->localAddress()); // Json processor - _jsonAPI.reset(new JsonAPI(client, _log, localConnection, this)); + _jsonAPI.reset(new JsonAPI(_peerAddress, _log, localConnection, this)); connect(_jsonAPI.get(), &JsonAPI::callbackReady, this, &WebSocketJsonHandler::sendMessage); connect(_jsonAPI->getCallBack().get(), &JsonCallbacks::callbackReady, this, &WebSocketJsonHandler::sendMessage); @@ -30,20 +35,29 @@ WebSocketJsonHandler::WebSocketJsonHandler(QWebSocket* websocket, QObject* paren void WebSocketJsonHandler::onTextMessageReceived(const QString& message) { - qDebug() << "WebSocket message received:" << message; - _jsonAPI.get()->handleMessage(message); +#ifdef RECEIVE_TRACE + qDebug() << "[" << _peerAddress << "] WebSocket message received:" << message; +#endif + _jsonAPI->handleMessage(message); +} + +void WebSocketJsonHandler::onBinaryMessageReceived(const QByteArray& message) +{ +#ifdef RECEIVE_TRACE + qDebug() << "[" << _peerAddress << "] WebSocket message received:" << message.toHex(); +#endif + Warning(_log,"Unexpected binary message received"); } qint64 WebSocketJsonHandler::sendMessage(QJsonObject obj) { - QString const message = JsonUtils::jsonValueToQString(obj); - qDebug() << "WebSocket send message: " << message; - return _websocket->sendTextMessage(message); +#ifdef TRACE_SEND + qDebug() << "[" << _peerAddress << "] WebSocket send message: " << obj; +#endif + return _websocket->sendTextMessage(JsonUtils::jsonValueToQString(obj)); } void WebSocketJsonHandler::onDisconnected() { - qDebug() << "WebSocket disconnected"; + Debug(_log, "WebSocket disconnected from %s initiated via: %s", QSTRING_CSTR(_peerAddress), QSTRING_CSTR(_origin)); } - - diff --git a/libsrc/webserver/WebSocketJsonHandler.h b/libsrc/webserver/WebSocketJsonHandler.h index 40c3f59d..1f4c234b 100644 --- a/libsrc/webserver/WebSocketJsonHandler.h +++ b/libsrc/webserver/WebSocketJsonHandler.h @@ -17,6 +17,7 @@ public: private slots: void onTextMessageReceived(const QString& message); + void onBinaryMessageReceived(const QByteArray& message); void onDisconnected(); qint64 sendMessage(QJsonObject obj); @@ -25,6 +26,8 @@ private: Logger* _log; QScopedPointer _jsonAPI; + QString _peerAddress; + QString _origin; }; #endif // WEBSOCKETJSONHANDLER_H