From 8dce6c67774854931c1729dcb851bc7beec41774 Mon Sep 17 00:00:00 2001 From: "Wohlert, Michel" Date: Wed, 26 Oct 2022 07:01:36 -0700 Subject: [PATCH] Add SSE awareness to QHttpEngine::Socket Allow the user to set sseEnabled on a socket basis in order for the socket not to be close on writes and redirects --- src/include/qhttpengine/socket.h | 9 +++++++++ src/src/socket.cpp | 33 ++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/include/qhttpengine/socket.h b/src/include/qhttpengine/socket.h index 16dd9b6..e52ee7e 100644 --- a/src/include/qhttpengine/socket.h +++ b/src/include/qhttpengine/socket.h @@ -311,6 +311,14 @@ class QHTTPENGINE_EXPORT Socket : public QIODevice */ void setHeaders(const HeaderMap &headers); + /** + * @brief Set the SSEEnabled flag + * + * Causes calls to write methods on the socket to leave connection open + * It will also not provide content length to prevent clients from closing connections + */ + void setSSEEnabled(bool enabled = false); + /** * @brief Write response headers to the socket * @@ -367,6 +375,7 @@ class QHTTPENGINE_EXPORT Socket : public QIODevice SocketPrivate *const d; friend class SocketPrivate; + bool sseEnabled; }; } diff --git a/src/src/socket.cpp b/src/src/socket.cpp index 7fc7777..3a3cb3f 100644 --- a/src/src/socket.cpp +++ b/src/src/socket.cpp @@ -196,7 +196,8 @@ void SocketPrivate::readData() Socket::Socket(QTcpSocket *socket, QObject *parent) : QIODevice(parent), - d(new SocketPrivate(this, socket)) + d(new SocketPrivate(this, socket)), + sseEnabled(false) { // The device is initially open for both reading and writing setOpenMode(QIODevice::ReadWrite); @@ -301,6 +302,11 @@ void Socket::setHeaders(const HeaderMap &headers) d->responseHeaders = headers; } +void Socket::setSSEEnabled(bool enabled) +{ + sseEnabled = enabled; +} + void Socket::writeHeaders() { // Use a QByteArray for building the header so that we can later determine @@ -335,7 +341,7 @@ void Socket::writeRedirect(const QByteArray &path, bool permanent) setStatusCode(permanent ? MovedPermanently : Found); setHeader("Location", path); writeHeaders(); - close(); + if (!sseEnabled) close(); } void Socket::writeError(int statusCode, const QByteArray &statusReason) @@ -348,23 +354,30 @@ void Socket::writeError(int statusCode, const QByteArray &statusReason) .arg(d->responseStatusReason.constData()) .arg(QHTTPENGINE_VERSION) .toUtf8(); + + if (!sseEnabled) + { + setHeader("Content-Length", QByteArray::number(data.length())); + setHeader("Content-Type", "text/html"); - setHeader("Content-Length", QByteArray::number(data.length())); - setHeader("Content-Type", "text/html"); + writeHeaders(); + } - writeHeaders(); write(data); - close(); + if (!sseEnabled) close(); } void Socket::writeJson(const QJsonDocument &document, int statusCode) { QByteArray data = document.toJson(); - setStatusCode(statusCode); - setHeader("Content-Length", QByteArray::number(data.length())); - setHeader("Content-Type", "application/json"); + if (!sseEnabled) + { + setStatusCode(statusCode); + setHeader("Content-Length", QByteArray::number(data.length())); + setHeader("Content-Type", "application/json"); + } write(data); - close(); + if (!sseEnabled) close(); } qint64 Socket::readData(char *data, qint64 maxlen)