summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Burtsev <kirill.burtsev@qt.io>2020-07-31 16:02:36 +0200
committerKirill Burtsev <kirill.burtsev@qt.io>2020-08-31 10:04:44 +0200
commit5f1f7e8913b74f9a88864b4155db8753007db52c (patch)
tree907faa08759152b4a8a6f802732532b9b38fb81e
parentcb9e6a7d90035cd50e389f000df1a3103e312af0 (diff)
Make HttpServer to server resource from dirs for unhandled requests
Change-Id: I2e15dff77c8f18af60a565cb74558f57c3527db8 Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
-rw-r--r--tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp34
-rw-r--r--tests/auto/shared/http.pri1
-rw-r--r--tests/auto/shared/httpserver.cpp25
-rw-r--r--tests/auto/shared/httpserver.h3
4 files changed, 31 insertions, 32 deletions
diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp
index aad7a205c..e3b7af18c 100644
--- a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp
+++ b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp
@@ -188,37 +188,6 @@ public:
}
};
-class TestServer : public HttpServer
-{
-public:
- TestServer()
- {
- connect(this, &HttpServer::newRequest, this, &TestServer::onNewRequest);
- }
-
-private:
- void onNewRequest(HttpReqRep *rr)
- {
- const QDir resourceDir(TESTS_SOURCE_DIR "qwebengineurlrequestinterceptor/resources");
- QString path = rr->requestPath();
- path.remove(0, 1);
-
- if (rr->requestMethod() != "GET" || !resourceDir.exists(path)) {
- rr->sendResponse(404);
- return;
- }
-
- QFile file(resourceDir.filePath(path));
- file.open(QIODevice::ReadOnly);
- QByteArray data = file.readAll();
- rr->setResponseBody(data);
- QMimeDatabase db;
- QMimeType mime = db.mimeTypeForFileNameAndData(file.fileName(), data);
- rr->setResponseHeader(QByteArrayLiteral("content-type"), mime.name().toUtf8());
- rr->sendResponse();
- }
-};
-
class ConsolePage : public QWebEnginePage {
Q_OBJECT
public:
@@ -759,7 +728,8 @@ void tst_QWebEngineUrlRequestInterceptor::jsServiceWorker()
{
QFETCH(InterceptorSetter, setter);
- TestServer server;
+ HttpServer server;
+ server.setResourceDirs({ TESTS_SOURCE_DIR "qwebengineurlrequestinterceptor/resources" });
QVERIFY(server.start());
QWebEngineProfile profile(QStringLiteral("Test"));
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;
};