From 2a309ce59657729c0d282aff5d03a3fe3845b8b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=BCrz?= Date: Fri, 7 Nov 2025 20:59:30 +0100 Subject: [PATCH] Move static file reply creation to the resource --- libnymea-core/servers/webserver.cpp | 38 +++------------------ libnymea/webserver/webserverresource.cpp | 43 ++++++++++++++++++++++++ libnymea/webserver/webserverresource.h | 2 ++ 3 files changed, 49 insertions(+), 34 deletions(-) diff --git a/libnymea-core/servers/webserver.cpp b/libnymea-core/servers/webserver.cpp index 7bb9ff39..e983971f 100644 --- a/libnymea-core/servers/webserver.cpp +++ b/libnymea-core/servers/webserver.cpp @@ -447,42 +447,12 @@ void WebServer::readClient() if (!verifyFile(socket, path)) return; - QFile file(path); - if (file.open(QFile::ReadOnly)) { - qCDebug(dcWebServer()) << "Load file" << file.fileName(); - HttpReply *reply = HttpReply::createSuccessReply(); - // Check content type - if (file.fileName().endsWith(".html")) { - reply->setHeader(HttpReply::ContentTypeHeader, "text/html; charset=\"utf-8\";"); - } else if (file.fileName().endsWith(".css")) { - reply->setHeader(HttpReply::ContentTypeHeader, "text/css; charset=\"utf-8\";"); - } else if (file.fileName().endsWith(".pdf")) { - reply->setHeader(HttpReply::ContentTypeHeader, "application/pdf"); - } else if (file.fileName().endsWith(".js")) { - reply->setHeader(HttpReply::ContentTypeHeader, "text/javascript; charset=\"utf-8\";"); - } else if (file.fileName().endsWith(".ttf")) { - reply->setHeader(HttpReply::ContentTypeHeader, "application/x-font-ttf"); - } else if (file.fileName().endsWith(".eot")) { - reply->setHeader(HttpReply::ContentTypeHeader, "application/vnd.ms-fontobject"); - } else if (file.fileName().endsWith(".woff")) { - reply->setHeader(HttpReply::ContentTypeHeader, "application/x-font-woff"); - } else if (file.fileName().endsWith(".jpg") || file.fileName().endsWith(".jpeg")) { - reply->setHeader(HttpReply::ContentTypeHeader, "image/jpeg"); - } else if (file.fileName().endsWith(".png") || file.fileName().endsWith(".PNG")) { - reply->setHeader(HttpReply::ContentTypeHeader, "image/png"); - } else if (file.fileName().endsWith(".ico")) { - reply->setHeader(HttpReply::ContentTypeHeader, "image/x-icon"); - } else if (file.fileName().endsWith(".svg")) { - reply->setHeader(HttpReply::ContentTypeHeader, "image/svg+xml; charset=\"utf-8\";"); - } + HttpReply *reply = WebServerResource::createFileReply(path); + reply->setClientId(clientId); + sendHttpReply(reply); + reply->deleteLater(); - reply->setPayload(file.readAll()); - reply->setClientId(clientId); - sendHttpReply(reply); - reply->deleteLater(); - return; - } } // Reject everything else... diff --git a/libnymea/webserver/webserverresource.cpp b/libnymea/webserver/webserverresource.cpp index 8d76d944..520621ed 100644 --- a/libnymea/webserver/webserverresource.cpp +++ b/libnymea/webserver/webserverresource.cpp @@ -29,6 +29,9 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ #include "webserverresource.h" +#include "loggingcategories.h" + +#include WebServerResource::WebServerResource(const QString &basePath, QObject *parent) : QObject{parent}, @@ -41,3 +44,43 @@ QString WebServerResource::basePath() const { return m_basePath; } + +HttpReply *WebServerResource::createFileReply(const QString fileName) +{ + qCDebug(dcWebServer()) << "Create file reply for" << fileName; + HttpReply *reply = HttpReply::createSuccessReply(); + + QFile file(fileName); + if (!file.open(QFile::ReadOnly)) { + qCWarning(dcWebServer()) << "Unable to generate file reply. The file" << fileName << "could not be opened. Respond with 403 Forbidden."; + return HttpReply::createErrorReply(HttpReply::Forbidden); + } + + // Check content type + if (file.fileName().endsWith(".html")) { + reply->setHeader(HttpReply::ContentTypeHeader, "text/html; charset=\"utf-8\";"); + } else if (file.fileName().endsWith(".css")) { + reply->setHeader(HttpReply::ContentTypeHeader, "text/css; charset=\"utf-8\";"); + } else if (file.fileName().endsWith(".pdf")) { + reply->setHeader(HttpReply::ContentTypeHeader, "application/pdf"); + } else if (file.fileName().endsWith(".js")) { + reply->setHeader(HttpReply::ContentTypeHeader, "text/javascript; charset=\"utf-8\";"); + } else if (file.fileName().endsWith(".ttf")) { + reply->setHeader(HttpReply::ContentTypeHeader, "application/x-font-ttf"); + } else if (file.fileName().endsWith(".eot")) { + reply->setHeader(HttpReply::ContentTypeHeader, "application/vnd.ms-fontobject"); + } else if (file.fileName().endsWith(".woff")) { + reply->setHeader(HttpReply::ContentTypeHeader, "application/x-font-woff"); + } else if (file.fileName().endsWith(".jpg") || file.fileName().endsWith(".jpeg")) { + reply->setHeader(HttpReply::ContentTypeHeader, "image/jpeg"); + } else if (file.fileName().endsWith(".png") || file.fileName().endsWith(".PNG")) { + reply->setHeader(HttpReply::ContentTypeHeader, "image/png"); + } else if (file.fileName().endsWith(".ico")) { + reply->setHeader(HttpReply::ContentTypeHeader, "image/x-icon"); + } else if (file.fileName().endsWith(".svg")) { + reply->setHeader(HttpReply::ContentTypeHeader, "image/svg+xml; charset=\"utf-8\";"); + } + + reply->setPayload(file.readAll()); + return reply; +} diff --git a/libnymea/webserver/webserverresource.h b/libnymea/webserver/webserverresource.h index 6827fd91..0f29fc83 100644 --- a/libnymea/webserver/webserverresource.h +++ b/libnymea/webserver/webserverresource.h @@ -50,6 +50,8 @@ public: virtual HttpReply *processRequest(const HttpRequest &request) = 0; + static HttpReply *createFileReply(const QString fileName); + protected: QString m_basePath;