diff options
author | Kirill Burtsev <kirill.burtsev@qt.io> | 2020-07-31 16:02:36 +0200 |
---|---|---|
committer | Kirill Burtsev <kirill.burtsev@qt.io> | 2020-08-31 10:04:44 +0200 |
commit | 5f1f7e8913b74f9a88864b4155db8753007db52c (patch) | |
tree | 907faa08759152b4a8a6f802732532b9b38fb81e /tests/auto/shared | |
parent | cb9e6a7d90035cd50e389f000df1a3103e312af0 (diff) |
Make HttpServer to server resource from dirs for unhandled requests
Change-Id: I2e15dff77c8f18af60a565cb74558f57c3527db8
Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
Diffstat (limited to 'tests/auto/shared')
-rw-r--r-- | tests/auto/shared/http.pri | 1 | ||||
-rw-r--r-- | tests/auto/shared/httpserver.cpp | 25 | ||||
-rw-r--r-- | tests/auto/shared/httpserver.h | 3 |
3 files changed, 29 insertions, 0 deletions
diff --git a/tests/auto/shared/http.pri b/tests/auto/shared/http.pri index 5236e9d26..7182bcbb0 100644 --- a/tests/auto/shared/http.pri +++ b/tests/auto/shared/http.pri @@ -1,3 +1,4 @@ HEADERS += $$PWD/httpserver.h $$PWD/httpreqrep.h SOURCES += $$PWD/httpserver.cpp $$PWD/httpreqrep.cpp INCLUDEPATH += $$PWD +DEFINES += TESTS_SHARED_DATA_DIR=\\\"$$re_escape($$PWD$${QMAKE_DIR_SEP}data)\\\" diff --git a/tests/auto/shared/httpserver.cpp b/tests/auto/shared/httpserver.cpp index c93d30706..67f491fac 100644 --- a/tests/auto/shared/httpserver.cpp +++ b/tests/auto/shared/httpserver.cpp @@ -27,7 +27,9 @@ ****************************************************************************/ #include "httpserver.h" +#include <QFile> #include <QLoggingCategory> +#include <QMimeDatabase> Q_LOGGING_CATEGORY(gHttpServerLog, "HttpServer") @@ -85,6 +87,29 @@ void HttpServer::handleNewConnection() auto rr = new HttpReqRep(m_tcpServer->nextPendingConnection(), this); connect(rr, &HttpReqRep::requestReceived, [this, rr]() { Q_EMIT newRequest(rr); + if (rr->isClosed()) // was explicitly answered + return; + + // if request wasn't handled or purposely ignored for default behavior + // then try to serve htmls from resources dirs if set + if (rr->requestMethod() == "GET") { + for (auto &&dir : qAsConst(m_dirs)) { + QFile f(dir + rr->requestPath()); + if (f.exists()) { + if (f.open(QFile::ReadOnly)) { + QMimeType mime = QMimeDatabase().mimeTypeForFileNameAndData(f.fileName(), &f); + rr->setResponseHeader(QByteArrayLiteral("Content-Type"), mime.name().toUtf8()); + rr->setResponseBody(f.readAll()); + rr->sendResponse(); + } else { + qWarning() << "Can't open resource" << f.fileName() << ": " << f.errorString(); + rr->sendResponse(500); // internal server error + } + break; + } + } + } + if (!rr->isClosed()) rr->sendResponse(404); }); diff --git a/tests/auto/shared/httpserver.h b/tests/auto/shared/httpserver.h index 57f824bb5..9764852de 100644 --- a/tests/auto/shared/httpserver.h +++ b/tests/auto/shared/httpserver.h @@ -76,6 +76,8 @@ public: // Full URL for given relative path Q_INVOKABLE QUrl url(const QString &path = QStringLiteral("/")) const; + Q_INVOKABLE void setResourceDirs(const QStringList &dirs) { m_dirs = dirs; } + Q_SIGNALS: // Emitted after a HTTP request has been successfully parsed. void newRequest(HttpReqRep *reqRep); @@ -86,6 +88,7 @@ private Q_SLOTS: private: QTcpServer *m_tcpServer; QUrl m_url; + QStringList m_dirs; bool m_error = false; bool m_expectingError = false; }; |