Revision control
++ // Copyright (C) 2016 Kurt Pattyn <pattyn.kurt@gmail.com>.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++ #include "sslechoserver.h"
++ #include "QtWebSockets/QWebSocketServer"
++ #include "QtWebSockets/QWebSocket"
++ #include <QtCore/QDebug>
++ #include <QtCore/QFile>
++ #include <QtNetwork/QSslCertificate>
++ #include <QtNetwork/QSslKey>
++
++ QT_USE_NAMESPACE
++
++ //! [constructor]
++ SslEchoServer::SslEchoServer(quint16 port, QObject *parent) :
++ QObject(parent),
++ m_pWebSocketServer(nullptr)
++ {
++ m_pWebSocketServer = new QWebSocketServer(QStringLiteral("SSL Echo Server"),
++ QWebSocketServer::SecureMode,
++ this);
++ QSslConfiguration sslConfiguration;
++ QFile certFile(QStringLiteral(":/localhost.cert"));
++ QFile keyFile(QStringLiteral(":/localhost.key"));
++ certFile.open(QIODevice::ReadOnly);
++ keyFile.open(QIODevice::ReadOnly);
++ QSslCertificate certificate(&certFile, QSsl::Pem);
++ QSslKey sslKey(&keyFile, QSsl::Rsa, QSsl::Pem);
++ certFile.close();
++ keyFile.close();
++ sslConfiguration.setPeerVerifyMode(QSslSocket::VerifyNone);
++ sslConfiguration.setLocalCertificate(certificate);
++ sslConfiguration.setPrivateKey(sslKey);
++ m_pWebSocketServer->setSslConfiguration(sslConfiguration);
++
++ if (m_pWebSocketServer->listen(QHostAddress::Any, port))
++ {
++ qDebug() << "SSL Echo Server listening on port" << port;
++ connect(m_pWebSocketServer, &QWebSocketServer::newConnection,
++ this, &SslEchoServer::onNewConnection);
++ connect(m_pWebSocketServer, &QWebSocketServer::sslErrors,
++ this, &SslEchoServer::onSslErrors);
++ }
++ }
++ //! [constructor]
++
++ SslEchoServer::~SslEchoServer()
++ {
++ m_pWebSocketServer->close();
++ qDeleteAll(m_clients.begin(), m_clients.end());
++ }
++
++ //! [onNewConnection]
++ void SslEchoServer::onNewConnection()
++ {
++ QWebSocket *pSocket = m_pWebSocketServer->nextPendingConnection();
++
++ qDebug() << "Client connected:" << pSocket->peerName() << pSocket->origin();
++
++ connect(pSocket, &QWebSocket::textMessageReceived, this, &SslEchoServer::processTextMessage);
++ connect(pSocket, &QWebSocket::binaryMessageReceived,
++ this, &SslEchoServer::processBinaryMessage);
++ connect(pSocket, &QWebSocket::disconnected, this, &SslEchoServer::socketDisconnected);
++
++ m_clients << pSocket;
++ }
++ //! [onNewConnection]
++
++ //! [processTextMessage]
++ void SslEchoServer::processTextMessage(QString message)
++ {
++ QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
++ if (pClient)
++ {
++ pClient->sendTextMessage(message);
++ }
++ }
++ //! [processTextMessage]
++
++ //! [processBinaryMessage]
++ void SslEchoServer::processBinaryMessage(QByteArray message)
++ {
++ QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
++ if (pClient)
++ {
++ pClient->sendBinaryMessage(message);
++ }
++ }
++ //! [processBinaryMessage]
++
++ //! [socketDisconnected]
++ void SslEchoServer::socketDisconnected()
++ {
++ qDebug() << "Client disconnected";
++ QWebSocket *pClient = qobject_cast<QWebSocket *>(sender());
++ if (pClient)
++ {
++ m_clients.removeAll(pClient);
++ pClient->deleteLater();
++ }
++ }
++
++ void SslEchoServer::onSslErrors(const QList<QSslError> &)
++ {
++ qDebug() << "Ssl errors occurred";
++ }
++ //! [socketDisconnected]