diff -ruN orig/src/websockets/qsslserver.cpp new/src/websockets/qsslserver.cpp --- orig/src/websockets/qsslserver.cpp 2017-09-19 16:53:44.136918574 +0200 +++ new/src/websockets/qsslserver.cpp 2017-09-20 11:42:25.201029244 +0200 @@ -51,6 +51,7 @@ #include #include +#include QT_BEGIN_NAMESPACE @@ -118,15 +119,54 @@ typedef void (QSslSocket::* sslErrorsSignal)(const QList &); connect(pSslSocket, static_cast(&QSslSocket::sslErrors), this, &QSslServer::sslErrors); - connect(pSslSocket, &QSslSocket::encrypted, this, &QSslServer::newEncryptedConnection); - - addPendingConnection(pSslSocket); + connect(pSslSocket, &QSslSocket::encrypted, this, &QSslServer::incomingConnectionEncrypted); pSslSocket->startServerEncryption(); + + QTimer* pTimer = new QTimer(); + connect(pTimer,&QTimer::timeout,this,&QSslServer::incomingConnectionTimeout); + pTimer->start(10000); + m_encryptingConnections.insert(pSslSocket,pTimer); + //qWarning() << "New Connection from" << pSslSocket->peerAddress().toString() << pSslSocket->peerPort(); } else { delete pSslSocket; } } } +void QSslServer::incomingConnectionEncrypted() +{ + QSslSocket *pSslSocket = qobject_cast(sender()); + if (Q_LIKELY(pSslSocket)) { + QTimer* pTimer = m_encryptingConnections.value(pSslSocket,NULL); + m_encryptingConnections.remove(pSslSocket); + if (pTimer) + { + pTimer->stop(); + pTimer->deleteLater(); + } + addPendingConnection(pSslSocket); + emit newEncryptedConnection(); + } +} + +void QSslServer::incomingConnectionTimeout() +{ + QTimer* pTimer = qobject_cast(sender()); + if (Q_UNLIKELY(!pTimer)) { + return; + } + pTimer->stop(); + pTimer->deleteLater(); + + QList sockets = m_encryptingConnections.keys(pTimer); + foreach(QSslSocket* pSslSocket, sockets) + { + //qWarning() << "Encyption timeout" << pSslSocket->peerAddress().toString() << pSslSocket->peerPort(); + m_encryptingConnections.remove(pSslSocket); + pSslSocket->close(); + pSslSocket->deleteLater(); + } +} + QT_END_NAMESPACE diff -ruN orig/src/websockets/qsslserver_p.h new/src/websockets/qsslserver_p.h --- orig/src/websockets/qsslserver_p.h 2017-09-19 16:53:44.136918574 +0200 +++ new/src/websockets/qsslserver_p.h 2017-09-20 11:08:18.331039398 +0200 @@ -58,6 +58,8 @@ QT_BEGIN_NAMESPACE +class QTimer; + class QSslServer : public QTcpServer { Q_OBJECT @@ -77,9 +79,12 @@ protected: virtual void incomingConnection(qintptr socket); + virtual void incomingConnectionEncrypted(); + virtual void incomingConnectionTimeout(); private: QSslConfiguration m_sslConfiguration; + QMap m_encryptingConnections; }; QT_END_NAMESPACE diff -ruN orig/src/websockets/qwebsocketserver_p.cpp new/src/websockets/qwebsocketserver_p.cpp --- orig/src/websockets/qwebsocketserver_p.cpp 2017-09-19 16:53:44.136918574 +0200 +++ new/src/websockets/qwebsocketserver_p.cpp 2017-09-20 11:44:12.051028714 +0200 @@ -52,6 +52,7 @@ #include #include #include +#include QT_BEGIN_NAMESPACE @@ -390,6 +391,14 @@ QObjectPrivate::connect(pTcpSocket, &QTcpSocket::readyRead, this, &QWebSocketServerPrivate::handshakeReceived, Qt::QueuedConnection); + + //qInfo() << "Encrypted Connection with" << pTcpSocket->peerAddress().toString(); + QTimer* m_pHandshakeTimer = new QTimer(); + QObjectPrivate::connect(m_pHandshakeTimer, &QTimer::timeout, + this, &QWebSocketServerPrivate::handshakeTimeout, + Qt::QueuedConnection); + m_pHandshakeTimer->start(10000); + m_handshakingConnections.insert(pTcpSocket,m_pHandshakeTimer); } } @@ -438,6 +447,14 @@ pTcpSocket->deleteLater(); setError(QWebSocketProtocol::CloseCodeAbnormalDisconnection, QWebSocketServer::tr("Too many pending connections.")); + + QTimer* pTimer = m_handshakingConnections.value(pTcpSocket,NULL); + m_handshakingConnections.remove(pTcpSocket); + if (pTimer) + { + pTimer->stop(); + pTimer->deleteLater(); + } return; } @@ -482,9 +499,44 @@ QWebSocketServer::tr("Invalid response received.")); } } + + QTimer* pTimer = m_handshakingConnections.value(pTcpSocket,NULL); + m_handshakingConnections.remove(pTcpSocket); + if (pTimer) + { + pTimer->stop(); + pTimer->deleteLater(); + //if (success) + // qInfo() << "Successful Connection from" << pTcpSocket->peerAddress().toString(); + //else + // qWarning() << "Handshake Failed from" << pTcpSocket->peerAddress().toString(); + } + if (!success) { pTcpSocket->close(); + pTcpSocket->deleteLater(); } } +void QWebSocketServerPrivate::handshakeTimeout() +{ + if (Q_UNLIKELY(!currentSender)) { + return; + } + QTimer* pTimer = qobject_cast(currentSender->sender); + if (Q_UNLIKELY(!pTimer)) { + return; + } + pTimer->stop(); + pTimer->deleteLater(); + + QList sockets = m_handshakingConnections.keys(pTimer); + foreach(QTcpSocket* pTcpSocket, sockets) + { + //qWarning() << "Got no Handshake from" << pTcpSocket->peerAddress().toString(); + m_handshakingConnections.remove(pTcpSocket); + pTcpSocket->close(); + pTcpSocket->deleteLater(); + } +} QT_END_NAMESPACE diff -ruN orig/src/websockets/qwebsocketserver_p.h new/src/websockets/qwebsocketserver_p.h --- orig/src/websockets/qwebsocketserver_p.h 2017-09-19 16:53:44.136918574 +0200 +++ new/src/websockets/qwebsocketserver_p.h 2017-09-19 17:12:11.786913079 +0200 @@ -66,6 +66,7 @@ class QTcpServer; class QWebSocketServer; +class QTimer; class QWebSocketServerPrivate : public QObjectPrivate { @@ -127,6 +128,7 @@ QString m_serverName; SslMode m_secureMode; QQueue m_pendingConnections; + QMap m_handshakingConnections; QWebSocketProtocol::CloseCode m_error; QString m_errorString; int m_maxPendingConnections; @@ -138,6 +140,7 @@ void onNewConnection(); void onCloseConnection(); void handshakeReceived(); + void handshakeTimeout(); }; QT_END_NAMESPACE