summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTasuku Suzuki <tasuku.suzuki@qbc.io>2019-04-27 15:54:53 +0900
committerTasuku Suzuki <tasuku.suzuki@qbc.io>2019-06-14 15:19:29 +0900
commitfc7908e628072c8d06aa4519add8a10d990ac76d (patch)
treef5a98151561b4cd7400f7e675338a2885af3fff2
parentc88c462ac7b7fd12a842cd2d77a8f4eef63a9bcd (diff)
Introduce QHttpServerResponse::fromFile()
This is a shortcut for static file contents. Change-Id: I54d97c60822e661c1405f27ea8d4598f0363b144 Reviewed-by: Mikhail Svetkin <mikhail.svetkin@qt.io> Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
-rw-r--r--examples/httpserver/simple/assets.qrc5
-rw-r--r--examples/httpserver/simple/assets/qt-logo.pngbin0 -> 1032 bytes
-rw-r--r--examples/httpserver/simple/main.cpp4
-rw-r--r--examples/httpserver/simple/simple.pro3
-rw-r--r--src/httpserver/qhttpserverresponse.cpp12
-rw-r--r--src/httpserver/qhttpserverresponse.h1
-rw-r--r--tests/auto/qhttpserver/data/application.json1
-rw-r--r--tests/auto/qhttpserver/data/text.html1
-rw-r--r--tests/auto/qhttpserver/qhttpserver.pro2
-rw-r--r--tests/auto/qhttpserver/tst_qhttpserver.cpp18
-rw-r--r--tests/auto/qhttpserverresponse/data/application.json1
-rw-r--r--tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp44
12 files changed, 91 insertions, 1 deletions
diff --git a/examples/httpserver/simple/assets.qrc b/examples/httpserver/simple/assets.qrc
new file mode 100644
index 0000000..e623543
--- /dev/null
+++ b/examples/httpserver/simple/assets.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>assets/qt-logo.png</file>
+ </qresource>
+</RCC>
diff --git a/examples/httpserver/simple/assets/qt-logo.png b/examples/httpserver/simple/assets/qt-logo.png
new file mode 100644
index 0000000..39a4a26
--- /dev/null
+++ b/examples/httpserver/simple/assets/qt-logo.png
Binary files differ
diff --git a/examples/httpserver/simple/main.cpp b/examples/httpserver/simple/main.cpp
index 410d6fe..b76f944 100644
--- a/examples/httpserver/simple/main.cpp
+++ b/examples/httpserver/simple/main.cpp
@@ -104,6 +104,10 @@ int main(int argc, char *argv[])
};
});
+ httpServer.route("/assets/<arg>", [] (const QUrl &url) {
+ return QHttpServerResponse::fromFile(QStringLiteral(":/assets/%1").arg(url.path()));
+ });
+
const auto port = httpServer.listen(QHostAddress::Any);
if (port == -1) {
qDebug() << QCoreApplication::translate(
diff --git a/examples/httpserver/simple/simple.pro b/examples/httpserver/simple/simple.pro
index d1f0889..a4ba393 100644
--- a/examples/httpserver/simple/simple.pro
+++ b/examples/httpserver/simple/simple.pro
@@ -9,3 +9,6 @@ SOURCES += \
target.path = $$[QT_INSTALL_EXAMPLES]/httpserver/simple
INSTALLS += target
+
+RESOURCES += \
+ assets.qrc
diff --git a/src/httpserver/qhttpserverresponse.cpp b/src/httpserver/qhttpserverresponse.cpp
index 870be8d..72ec7ac 100644
--- a/src/httpserver/qhttpserverresponse.cpp
+++ b/src/httpserver/qhttpserverresponse.cpp
@@ -31,6 +31,7 @@
#include <private/qhttpserverresponse_p.h>
+#include <QtCore/qfile.h>
#include <QtCore/qjsondocument.h>
#include <QtCore/qjsonobject.h>
#include <QtCore/qmimedatabase.h>
@@ -85,6 +86,17 @@ QHttpServerResponse::~QHttpServerResponse()
{
}
+QHttpServerResponse QHttpServerResponse::fromFile(const QString &fileName)
+{
+ QFile file(fileName);
+ if (!file.open(QFile::ReadOnly))
+ return QHttpServerResponse(StatusCode::NotFound);
+ const QByteArray data = file.readAll();
+ file.close();
+ const QByteArray mimeType = QMimeDatabase().mimeTypeForFileNameAndData(fileName, data).name().toLocal8Bit();
+ return QHttpServerResponse(mimeType, data);
+}
+
QHttpServerResponse::QHttpServerResponse(QHttpServerResponsePrivate *d)
: d_ptr(d)
{
diff --git a/src/httpserver/qhttpserverresponse.h b/src/httpserver/qhttpserverresponse.h
index 2ee0c0d..89e5b9e 100644
--- a/src/httpserver/qhttpserverresponse.h
+++ b/src/httpserver/qhttpserverresponse.h
@@ -62,6 +62,7 @@ public:
const QByteArray &data,
const StatusCode status = StatusCode::Ok);
virtual ~QHttpServerResponse();
+ static QHttpServerResponse fromFile(const QString &fileName);
QByteArray data() const;
diff --git a/tests/auto/qhttpserver/data/application.json b/tests/auto/qhttpserver/data/application.json
new file mode 100644
index 0000000..7ba1b79
--- /dev/null
+++ b/tests/auto/qhttpserver/data/application.json
@@ -0,0 +1 @@
+{ "key": "value" }
diff --git a/tests/auto/qhttpserver/data/text.html b/tests/auto/qhttpserver/data/text.html
new file mode 100644
index 0000000..18ecdcb
--- /dev/null
+++ b/tests/auto/qhttpserver/data/text.html
@@ -0,0 +1 @@
+<html></html>
diff --git a/tests/auto/qhttpserver/qhttpserver.pro b/tests/auto/qhttpserver/qhttpserver.pro
index cfb61d1..d496ebb 100644
--- a/tests/auto/qhttpserver/qhttpserver.pro
+++ b/tests/auto/qhttpserver/qhttpserver.pro
@@ -3,3 +3,5 @@ TARGET = tst_qhttpserver
SOURCES += tst_qhttpserver.cpp
QT = httpserver httpserver-private testlib
+
+TESTDATA += data/
diff --git a/tests/auto/qhttpserver/tst_qhttpserver.cpp b/tests/auto/qhttpserver/tst_qhttpserver.cpp
index d1590f4..dd1e593 100644
--- a/tests/auto/qhttpserver/tst_qhttpserver.cpp
+++ b/tests/auto/qhttpserver/tst_qhttpserver.cpp
@@ -192,6 +192,10 @@ void tst_QHttpServer::initTestCase()
return request.body();
});
+ httpserver.route("/file/", [] (const QString &file) {
+ return QHttpServerResponse::fromFile(QFINDTESTDATA(QLatin1String("data/") + file));
+ });
+
urlBase = QStringLiteral("http://localhost:%1%2").arg(httpserver.listen());
}
@@ -344,6 +348,18 @@ void tst_QHttpServer::routeGet_data()
<< 200
<< "text/plain"
<< "Get";
+
+ QTest::addRow("response from html file")
+ << "/file/text.html"
+ << 200
+ << "text/html"
+ << "<html></html>";
+
+ QTest::addRow("response from json file")
+ << "/file/application.json"
+ << 200
+ << "application/json"
+ << "{ \"key\": \"value\" }";
}
void tst_QHttpServer::routeGet()
@@ -361,7 +377,7 @@ void tst_QHttpServer::routeGet()
QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), type);
QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), code);
- QCOMPARE(reply->readAll(), body);
+ QCOMPARE(reply->readAll().trimmed(), body);
}
void tst_QHttpServer::routeKeepAlive()
diff --git a/tests/auto/qhttpserverresponse/data/application.json b/tests/auto/qhttpserverresponse/data/application.json
new file mode 100644
index 0000000..7ba1b79
--- /dev/null
+++ b/tests/auto/qhttpserverresponse/data/application.json
@@ -0,0 +1 @@
+{ "key": "value" }
diff --git a/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp b/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp
index e531c48..a7cd837 100644
--- a/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp
+++ b/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp
@@ -41,6 +41,8 @@ class tst_QHttpServerResponse : public QObject
private slots:
void mimeTypeDetection_data();
void mimeTypeDetection();
+ void mimeTypeDetectionFromFile_data();
+ void mimeTypeDetectionFromFile();
};
void tst_QHttpServerResponse::mimeTypeDetection_data()
@@ -86,6 +88,48 @@ void tst_QHttpServerResponse::mimeTypeDetection()
QCOMPARE(response.mimeType(), mimeType);
}
+void tst_QHttpServerResponse::mimeTypeDetectionFromFile_data()
+{
+ QTest::addColumn<QString>("content");
+ QTest::addColumn<QByteArray>("mimeType");
+
+ QTest::addRow("application/x-zerosize")
+ << QFINDTESTDATA("data/empty")
+ << QByteArrayLiteral("application/x-zerosize");
+
+ QTest::addRow("text/plain")
+ << QFINDTESTDATA("data/text.plain")
+ << QByteArrayLiteral("text/plain");
+
+ QTest::addRow("text/html")
+ << QFINDTESTDATA("data/text.html")
+ << QByteArrayLiteral("text/html");
+
+ QTest::addRow("image/png")
+ << QFINDTESTDATA("data/image.png")
+ << QByteArrayLiteral("image/png");
+
+ QTest::addRow("image/jpeg")
+ << QFINDTESTDATA("data/image.jpeg")
+ << QByteArrayLiteral("image/jpeg");
+
+ QTest::addRow("image/svg+xml")
+ << QFINDTESTDATA("data/image.svg")
+ << QByteArrayLiteral("image/svg+xml");
+
+ QTest::addRow("application/json")
+ << QFINDTESTDATA("data/application.json")
+ << QByteArrayLiteral("application/json");
+}
+
+void tst_QHttpServerResponse::mimeTypeDetectionFromFile()
+{
+ QFETCH(QString, content);
+ QFETCH(QByteArray, mimeType);
+
+ QCOMPARE(QHttpServerResponse::fromFile(content).mimeType(), mimeType);
+}
+
QT_END_NAMESPACE
QTEST_MAIN(tst_QHttpServerResponse)