From b2d610c0ea229e40910fc9aa1bc784d853cfeba8 Mon Sep 17 00:00:00 2001
From: Aleksey Lysenko <lysenkoalexmail@gmail.com>
Date: Tue, 6 Dec 2016 09:50:30 +0200
Subject: [PATCH] Delete disconnected socket

Method onSocketDisconnected has never been called, so WebSocketServer did not
handle closed connection properly. Moreover, socket was not freed in time
and this led to increase in memory consumption

Task-number: QTBUG-56414
Change-Id: Ib57f5b88413ffeef4f296a260245ba0a8d25adb2
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Liang Qi <liang.qi@qt.io>
---
 src/websockets/qwebsocketserver_p.cpp | 6 ++++--
 src/websockets/qwebsocketserver_p.h   | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/websockets/qwebsocketserver_p.cpp b/src/websockets/qwebsocketserver_p.cpp
index 91bfafcd..3bf6d680 100644
--- a/src/websockets/qwebsocketserver_p.cpp
+++ b/src/websockets/qwebsocketserver_p.cpp
@@ -392,18 +392,20 @@ void QWebSocketServerPrivate::onNewConnection()
         QObjectPrivate::connect(pTcpSocket, &QTcpSocket::readyRead,
                                 this, &QWebSocketServerPrivate::handshakeReceived,
                                 Qt::QueuedConnection);
+        QObjectPrivate::connect(pTcpSocket, &QTcpSocket::disconnected,
+                                this, &QWebSocketServerPrivate::onSocketDisconnected);
     }
 }
 
 /*!
     \internal
  */
-void QWebSocketServerPrivate::onCloseConnection()
+void QWebSocketServerPrivate::onSocketDisconnected()
 {
     if (Q_LIKELY(currentSender)) {
         QTcpSocket *pTcpSocket = qobject_cast<QTcpSocket*>(currentSender->sender);
         if (Q_LIKELY(pTcpSocket))
-            pTcpSocket->close();
+            pTcpSocket->deleteLater();
     }
 }
 
diff --git a/src/websockets/qwebsocketserver_p.h b/src/websockets/qwebsocketserver_p.h
index 46a21566..6aabebdf 100644
--- a/src/websockets/qwebsocketserver_p.h
+++ b/src/websockets/qwebsocketserver_p.h
@@ -136,7 +136,7 @@ private:
                                  const QString &errorDescription);
 
     void onNewConnection();
-    void onCloseConnection();
+    void onSocketDisconnected();
     void handshakeReceived();
 };
 
-- 
GitLab