diff --git a/src/base/http/types.h b/src/base/http/types.h
index 2e16d9630..0e30feb9e 100644
--- a/src/base/http/types.h
+++ b/src/base/http/types.h
@@ -63,10 +63,12 @@ namespace Http
const char HEADER_REQUEST_METHOD_POST[] = "POST";
const char CONTENT_TYPE_HTML[] = "text/html";
+ const char CONTENT_TYPE_CSS[] = "text/css";
+ const char CONTENT_TYPE_TXT[] = "text/plain";
+ const char CONTENT_TYPE_JS[] = "application/javascript";
const char CONTENT_TYPE_JSON[] = "application/json";
const char CONTENT_TYPE_GIF[] = "image/gif";
const char CONTENT_TYPE_PNG[] = "image/png";
- const char CONTENT_TYPE_TXT[] = "text/plain";
const char CONTENT_TYPE_FORM_ENCODED[] = "application/x-www-form-urlencoded";
const char CONTENT_TYPE_FORM_DATA[] = "multipart/form-data";
diff --git a/src/webui/webapplication.cpp b/src/webui/webapplication.cpp
index 349ebefe4..28bab0ba8 100644
--- a/src/webui/webapplication.cpp
+++ b/src/webui/webapplication.cpp
@@ -73,7 +73,6 @@ const QString PATH_PREFIX_THEME {QStringLiteral("/theme/")};
const QString WWW_FOLDER {QStringLiteral(":/www")};
const QString PUBLIC_FOLDER {QStringLiteral("/public")};
const QString PRIVATE_FOLDER {QStringLiteral("/private")};
-const QString MAX_AGE_MONTH {QStringLiteral("public, max-age=2592000")};
namespace
{
@@ -141,6 +140,22 @@ namespace
return QUrl(QLatin1String("http://") + hostHeader);
return hostHeader;
}
+
+ QString getCachingInterval(QString contentType)
+ {
+ contentType = contentType.toLower();
+
+ if (contentType.startsWith(QLatin1String("image/")))
+ return QLatin1String("private, max-age=604800"); // 1 week
+
+ if ((contentType == Http::CONTENT_TYPE_CSS)
+ || (contentType == Http::CONTENT_TYPE_JS)) {
+ // short interval in case of program update
+ return QLatin1String("private, max-age=43200"); // 12 hrs
+ }
+
+ return QLatin1String("no-store");
+ }
}
WebApplication::WebApplication(QObject *parent)
@@ -176,14 +191,12 @@ void WebApplication::sendWebUIFile()
if (request().path.startsWith(PATH_PREFIX_IMAGES)) {
const QString imageFilename {request().path.mid(PATH_PREFIX_IMAGES.size())};
sendFile(QLatin1String(":/icons/") + imageFilename);
- header(Http::HEADER_CACHE_CONTROL, MAX_AGE_MONTH);
return;
}
if (request().path.startsWith(PATH_PREFIX_THEME)) {
const QString iconId {request().path.mid(PATH_PREFIX_THEME.size())};
sendFile(IconProvider::instance()->getIconPath(iconId));
- header(Http::HEADER_CACHE_CONTROL, MAX_AGE_MONTH);
return;
}
}
@@ -455,7 +468,9 @@ void WebApplication::sendFile(const QString &path)
// find translated file in cache
auto it = m_translatedFiles.constFind(path);
if ((it != m_translatedFiles.constEnd()) && (lastModified <= (*it).lastModified)) {
- print((*it).data, QMimeDatabase().mimeTypeForFileNameAndData(path, (*it).data).name());
+ const QString mimeName {QMimeDatabase().mimeTypeForFileNameAndData(path, (*it).data).name()};
+ print((*it).data, mimeName);
+ header(Http::HEADER_CACHE_CONTROL, getCachingInterval(mimeName));
return;
}
@@ -474,8 +489,8 @@ void WebApplication::sendFile(const QString &path)
QByteArray data {file.readAll()};
file.close();
- const QMimeType type {QMimeDatabase().mimeTypeForFileNameAndData(path, data)};
- const bool isTranslatable {type.inherits(QLatin1String("text/plain"))};
+ const QMimeType mimeType {QMimeDatabase().mimeTypeForFileNameAndData(path, data)};
+ const bool isTranslatable {mimeType.inherits(QLatin1String("text/plain"))};
// Translate the file
if (isTranslatable) {
@@ -486,7 +501,8 @@ void WebApplication::sendFile(const QString &path)
m_translatedFiles[path] = {data, lastModified}; // caching translated file
}
- print(data, type.name());
+ print(data, mimeType.name());
+ header(Http::HEADER_CACHE_CONTROL, getCachingInterval(mimeType.name()));
}
Http::Response WebApplication::processRequest(const Http::Request &request, const Http::Environment &env)
diff --git a/src/webui/webui.qrc b/src/webui/webui.qrc
index 686aea1db..7baac49c9 100644
--- a/src/webui/webui.qrc
+++ b/src/webui/webui.qrc
@@ -42,7 +42,7 @@