18 #include "staticsimple_p.h"
20 #include "application.h"
25 #include <QMimeDatabase>
29 #include <QLoggingCategory>
33 Q_LOGGING_CATEGORY(C_STATICSIMPLE,
"cutelyst.plugin.staticsimple", QtWarningMsg)
36 , d_ptr(new StaticSimplePrivate)
39 d->includePaths.append(parent->config(QLatin1String(
"root")).toString());
42 StaticSimple::~StaticSimple()
50 d->includePaths.clear();
51 for (
const QString &path : paths) {
52 d->includePaths.append(QDir(path));
65 this, &StaticSimple::beforePrepareAction);
69 void StaticSimple::beforePrepareAction(
Context *c,
bool *skipMethod)
77 const QString path = c->req()->path();
78 const QRegularExpression re = d->re;
80 for (
const QString &dir : d->dirs) {
81 if (path.startsWith(dir)) {
82 if (!locateStaticFile(c, path)) {
86 res->
setBody(QStringLiteral(
"File not found: ") + path);
94 QRegularExpressionMatch match = re.match(path);
95 if (match.hasMatch() && locateStaticFile(c, path)) {
100 bool StaticSimple::locateStaticFile(
Context *c,
const QString &relPath)
104 for (
const QDir &includePath : d->includePaths) {
105 QString path = includePath.absoluteFilePath(relPath);
106 QFileInfo fileInfo(path);
107 if (fileInfo.exists()) {
109 const QDateTime currentDateTime = fileInfo.lastModified();
110 if (!c->req()->headers().ifModifiedSince(currentDateTime)) {
115 QFile *file =
new QFile(path);
116 if (file->open(QFile::ReadOnly)) {
117 qCDebug(C_STATICSIMPLE) <<
"Serving" << path;
123 static QMimeDatabase db;
125 QMimeType mimeType = db.mimeTypeForFile(path, QMimeDatabase::MatchExtension);
126 if (mimeType.isValid()) {
133 headers.
setHeader(QStringLiteral(
"CACHE_CONTROL"), QStringLiteral(
"public"));
138 qCWarning(C_STATICSIMPLE) <<
"Could not serve" << path << file->errorString();
143 qCWarning(C_STATICSIMPLE) <<
"File not found" << relPath;
147 #include "moc_staticsimple.cpp"