diff options
Diffstat (limited to 'src/websockets/qwebsocketserver_p.cpp')
-rw-r--r-- | src/websockets/qwebsocketserver_p.cpp | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/src/websockets/qwebsocketserver_p.cpp b/src/websockets/qwebsocketserver_p.cpp index 4c3eeaf..8225b59 100644 --- a/src/websockets/qwebsocketserver_p.cpp +++ b/src/websockets/qwebsocketserver_p.cpp @@ -49,6 +49,7 @@ #include "qwebsocket_p.h" #include "qwebsocketcorsauthenticator.h" +#include <QtCore/QTimer> #include <QtNetwork/QTcpServer> #include <QtNetwork/QTcpSocket> #include <QtNetwork/QNetworkProxy> @@ -73,7 +74,8 @@ QWebSocketServerPrivate::QWebSocketServerPrivate(const QString &serverName, m_pendingConnections(), m_error(QWebSocketProtocol::CloseCodeNormal), m_errorString(), - m_maxPendingConnections(30) + m_maxPendingConnections(30), + m_handshakeTimeout(10000) {} /*! @@ -97,6 +99,8 @@ void QWebSocketServerPrivate::init() QObjectPrivate::connect(pSslServer, &QSslServer::newEncryptedConnection, this, &QWebSocketServerPrivate::onNewConnection, Qt::QueuedConnection); + QObjectPrivate::connect(pSslServer, &QSslServer::startedEncryptionHandshake, + this, &QWebSocketServerPrivate::startHandshakeTimeout); QObject::connect(pSslServer, &QSslServer::peerVerifyError, q, &QWebSocketServer::peerVerifyError); QObject::connect(pSslServer, &QSslServer::sslErrors, @@ -381,8 +385,12 @@ void QWebSocketServerPrivate::setError(QWebSocketProtocol::CloseCode code, const */ void QWebSocketServerPrivate::onNewConnection() { - while (m_pTcpServer->hasPendingConnections()) - handleConnection(m_pTcpServer->nextPendingConnection()); + while (m_pTcpServer->hasPendingConnections()) { + QTcpSocket *pTcpSocket = m_pTcpServer->nextPendingConnection(); + if (Q_LIKELY(pTcpSocket) && m_secureMode == NonSecureMode) + startHandshakeTimeout(pTcpSocket); + handleConnection(pTcpSocket); + } } /*! @@ -463,6 +471,7 @@ void QWebSocketServerPrivate::handshakeReceived() request, response); if (pWebSocket) { + finishHandshakeTimeout(pTcpSocket); addPendingConnection(pWebSocket); Q_EMIT q->newConnection(); success = true; @@ -502,4 +511,26 @@ void QWebSocketServerPrivate::handleConnection(QTcpSocket *pTcpSocket) const } } +void QWebSocketServerPrivate::startHandshakeTimeout(QTcpSocket *pTcpSocket) +{ + if (m_handshakeTimeout < 0) + return; + + QTimer *handshakeTimer = new QTimer(pTcpSocket); + handshakeTimer->setSingleShot(true); + handshakeTimer->setObjectName(QStringLiteral("handshakeTimer")); + QObject::connect(handshakeTimer, &QTimer::timeout, [=]() { + pTcpSocket->close(); + }); + handshakeTimer->start(m_handshakeTimeout); +} + +void QWebSocketServerPrivate::finishHandshakeTimeout(QTcpSocket *pTcpSocket) +{ + if (QTimer *handshakeTimer = pTcpSocket->findChild<QTimer *>(QStringLiteral("handshakeTimer"))) { + handshakeTimer->stop(); + delete handshakeTimer; + } +} + QT_END_NAMESPACE |