diff options
author | Tasuku Suzuki <tasuku.suzuki@qbc.io> | 2019-04-27 15:54:53 +0900 |
---|---|---|
committer | Tasuku Suzuki <tasuku.suzuki@qbc.io> | 2019-06-14 15:19:29 +0900 |
commit | fc7908e628072c8d06aa4519add8a10d990ac76d (patch) | |
tree | f5a98151561b4cd7400f7e675338a2885af3fff2 | |
parent | c88c462ac7b7fd12a842cd2d77a8f4eef63a9bcd (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.qrc | 5 | ||||
-rw-r--r-- | examples/httpserver/simple/assets/qt-logo.png | bin | 0 -> 1032 bytes | |||
-rw-r--r-- | examples/httpserver/simple/main.cpp | 4 | ||||
-rw-r--r-- | examples/httpserver/simple/simple.pro | 3 | ||||
-rw-r--r-- | src/httpserver/qhttpserverresponse.cpp | 12 | ||||
-rw-r--r-- | src/httpserver/qhttpserverresponse.h | 1 | ||||
-rw-r--r-- | tests/auto/qhttpserver/data/application.json | 1 | ||||
-rw-r--r-- | tests/auto/qhttpserver/data/text.html | 1 | ||||
-rw-r--r-- | tests/auto/qhttpserver/qhttpserver.pro | 2 | ||||
-rw-r--r-- | tests/auto/qhttpserver/tst_qhttpserver.cpp | 18 | ||||
-rw-r--r-- | tests/auto/qhttpserverresponse/data/application.json | 1 | ||||
-rw-r--r-- | tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp | 44 |
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 Binary files differnew file mode 100644 index 0000000..39a4a26 --- /dev/null +++ b/examples/httpserver/simple/assets/qt-logo.png 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) |