summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMikhail Svetkin <mikhail.svetkin@gmail.com>2020-06-04 23:53:12 +0200
committerMikhail Svetkin <mikhail.svetkin@gmail.com>2020-06-06 21:48:40 +0200
commit2a67efadf1f02671e74ada7fc84bea9009182bc7 (patch)
tree5b145e5e831de9d7a62810cb93394a5e5271d9af /src
parent7e29e0dfebec0e6e60cf2af357c0c6290a048c5d (diff)
Don't destory socket and request objects while handling a request
Task-number: QTBUG-84617 Change-Id: Ibf98fb329c817ae39f66e539cdb30a4194cb3b42 Reviewed-by: Mikhail Svetkin <mikhail.svetkin@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/httpserver/qabstracthttpserver.cpp12
-rw-r--r--src/httpserver/qhttpserverrequest_p.h1
-rw-r--r--src/httpserver/qhttpserverresponse.cpp4
3 files changed, 15 insertions, 2 deletions
diff --git a/src/httpserver/qabstracthttpserver.cpp b/src/httpserver/qabstracthttpserver.cpp
index 2b699ed..5a6e1e5 100644
--- a/src/httpserver/qabstracthttpserver.cpp
+++ b/src/httpserver/qabstracthttpserver.cpp
@@ -63,8 +63,12 @@ void QAbstractHttpServerPrivate::handleNewConnections()
handleReadyRead(socket, request);
});
- QObject::connect(socket, &QTcpSocket::disconnected, &QObject::deleteLater);
- QObject::connect(socket, &QObject::destroyed, [request] () {
+ QObject::connect(socket, &QTcpSocket::disconnected, socket, [request, socket] () {
+ if (!request->d->handling)
+ socket->deleteLater();
+ });
+
+ QObject::connect(socket, &QObject::destroyed, socket, [request] () {
delete request;
});
}
@@ -118,8 +122,12 @@ void QAbstractHttpServerPrivate::handleReadyRead(QTcpSocket *socket,
}
socket->commitTransaction();
+ request->d->handling = true;
if (!q->handleRequest(*request, socket))
Q_EMIT q->missingHandler(*request, socket);
+ request->d->handling = false;
+ if (socket->state() == QAbstractSocket::UnconnectedState)
+ socket->deleteLater();
}
QAbstractHttpServer::QAbstractHttpServer(QObject *parent)
diff --git a/src/httpserver/qhttpserverrequest_p.h b/src/httpserver/qhttpserverrequest_p.h
index ae0216b..6459cc4 100644
--- a/src/httpserver/qhttpserverrequest_p.h
+++ b/src/httpserver/qhttpserverrequest_p.h
@@ -88,6 +88,7 @@ public:
void clear();
QHostAddress remoteAddress;
+ bool handling{false};
private:
static http_parser_settings httpParserSettings;
diff --git a/src/httpserver/qhttpserverresponse.cpp b/src/httpserver/qhttpserverresponse.cpp
index 5ed230e..5bd510b 100644
--- a/src/httpserver/qhttpserverresponse.cpp
+++ b/src/httpserver/qhttpserverresponse.cpp
@@ -37,6 +37,7 @@
#include <QtCore/qjsondocument.h>
#include <QtCore/qjsonobject.h>
#include <QtCore/qmimedatabase.h>
+#include <QtNetwork/qtcpsocket.h>
QT_BEGIN_NAMESPACE
@@ -353,6 +354,9 @@ QVector<QByteArray> QHttpServerResponse::headers(const QByteArray &name) const
void QHttpServerResponse::write(QHttpServerResponder &&responder) const
{
Q_D(const QHttpServerResponse);
+ if (responder.socket()->state() != QAbstractSocket::ConnectedState)
+ return;
+
responder.writeStatusLine(d->statusCode);
for (auto &&header : d->headers)