mirror of
https://github.com/hyperion-project/hyperion.ng.git
synced 2025-03-01 10:33:28 +00:00
Updates
This commit is contained in:
parent
fb1703f5e2
commit
becbbeba27
@ -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);
|
||||
|
@ -5,6 +5,7 @@
|
||||
#include <QString>
|
||||
#include <QWebSocketServer>
|
||||
#include <QCoreApplication>
|
||||
#include <QScopedPointer>
|
||||
|
||||
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<QWebSocketServer> m_websocketServer;
|
||||
};
|
||||
|
||||
#endif // QTHTTPCLIENTWRAPPER_H
|
||||
|
@ -46,21 +46,22 @@ public:
|
||||
|
||||
typedef void (QSslSocket::* SslErrorSignal) (const QList<QSslError> &);
|
||||
|
||||
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<QSslCertificate> & certs) { m_sslCerts = certs; };
|
||||
QSslKey getPrivateKey() { return m_sslKey; };
|
||||
QList<QSslCertificate> 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<QSslCertificate> & certs) { m_sslCerts = certs; }
|
||||
QSslKey getPrivateKey() { return m_sslKey; }
|
||||
QList<QSslCertificate> 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<QSslError> & 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<QSslError> & errors) { Q_UNUSED (errors) }
|
||||
void onClientSslModeChanged (QSslSocket::SslMode mode) { Q_UNUSED (mode) }
|
||||
|
||||
private:
|
||||
bool m_useSsl;
|
||||
|
@ -5,21 +5,26 @@
|
||||
#include <utils/JsonUtils.h>
|
||||
#include <utils/NetOrigin.h>
|
||||
|
||||
#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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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> _jsonAPI;
|
||||
QString _peerAddress;
|
||||
QString _origin;
|
||||
};
|
||||
|
||||
#endif // WEBSOCKETJSONHANDLER_H
|
||||
|
Loading…
x
Reference in New Issue
Block a user