diff options
author | Mikhail Svetkin <mikhail.svetkin@gmail.com> | 2019-07-21 12:27:36 +0200 |
---|---|---|
committer | Mikhail Svetkin <mikhail.svetkin@gmail.com> | 2019-08-21 22:07:26 +0200 |
commit | f46cb8832f19a0a40cb9fb55a5a86d821daa962a (patch) | |
tree | 43e780a408a08607fe62ec4edb291c8e0f42d744 | |
parent | 03f911fd0a4bb2768835fe16b9bef0893ccc25b9 (diff) |
Add QHttpServerLiterals
Currently we have a lot of duplication of most common HTTP headers and their
values.
This patch moves them to one place.
Change-Id: Idf9ddc5164e81649b4cc37ed92a516eb1eedab3a
Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Reviewed-by: Tasuku Suzuki <tasuku.suzuki@qbc.io>
-rw-r--r-- | src/httpserver/httpserver.pro | 2 | ||||
-rw-r--r-- | src/httpserver/qhttpserverliterals.cpp | 59 | ||||
-rw-r--r-- | src/httpserver/qhttpserverliterals_p.h | 62 | ||||
-rw-r--r-- | src/httpserver/qhttpserverresponder.cpp | 34 | ||||
-rw-r--r-- | src/httpserver/qhttpserverresponse.cpp | 19 | ||||
-rw-r--r-- | tests/auto/qhttpserver/tst_qhttpserver.cpp | 16 | ||||
-rw-r--r-- | tests/auto/qhttpserverresponder/qhttpserverresponder.pro | 2 | ||||
-rw-r--r-- | tests/auto/qhttpserverresponder/tst_qhttpserverresponder.cpp | 21 | ||||
-rw-r--r-- | tests/auto/qhttpserverresponse/qhttpserverresponse.pro | 2 | ||||
-rw-r--r-- | tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp | 6 |
10 files changed, 181 insertions, 42 deletions
diff --git a/src/httpserver/httpserver.pro b/src/httpserver/httpserver.pro index d683ee3..1ba716b 100644 --- a/src/httpserver/httpserver.pro +++ b/src/httpserver/httpserver.pro @@ -11,6 +11,7 @@ HEADERS += \ qabstracthttpserver_p.h \ qhttpserver.h \ qhttpserver_p.h \ + qhttpserverliterals_p.h \ qhttpserverrequest.h \ qhttpserverrequest_p.h \ qhttpserverresponder.h \ @@ -26,6 +27,7 @@ HEADERS += \ SOURCES += \ qabstracthttpserver.cpp \ qhttpserver.cpp \ + qhttpserverliterals.cpp \ qhttpserverrequest.cpp \ qhttpserverresponder.cpp \ qhttpserverresponse.cpp \ diff --git a/src/httpserver/qhttpserverliterals.cpp b/src/httpserver/qhttpserverliterals.cpp new file mode 100644 index 0000000..3fc7627 --- /dev/null +++ b/src/httpserver/qhttpserverliterals.cpp @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Mikhail Svetkin <mikhail.svetkin@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtHttpServer module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qhttpserverliterals_p.h" + +QT_BEGIN_NAMESPACE + +QByteArray QHttpServerLiterals::contentTypeHeader() +{ + return QByteArrayLiteral("Content-Type"); +} + +QByteArray QHttpServerLiterals::contentTypeXEmpty() +{ + return QByteArrayLiteral("application/x-empty"); +} + +QByteArray QHttpServerLiterals::contentTypeTextHtml() +{ + return QByteArrayLiteral("text/html"); +} + +QByteArray QHttpServerLiterals::contentTypeJson() +{ + return QByteArrayLiteral("application/json"); +} + +QByteArray QHttpServerLiterals::contentLengthHeader() +{ + return QByteArrayLiteral("Content-Length"); +} + +QT_END_NAMESPACE diff --git a/src/httpserver/qhttpserverliterals_p.h b/src/httpserver/qhttpserverliterals_p.h new file mode 100644 index 0000000..a6ac05a --- /dev/null +++ b/src/httpserver/qhttpserverliterals_p.h @@ -0,0 +1,62 @@ +/**************************************************************************** +** +** Copyright (C) 2019 Mikhail Svetkin <mikhail.svetkin@gmail.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtHttpServer module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 or (at your option) any later version +** approved by the KDE Free Qt Foundation. The licenses are as published by +** the Free Software Foundation and appearing in the file LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QHTTPSERVERLITERALS_P_H +#define QHTTPSERVERLITERALS_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of QHttpServer. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. + +#include <QtHttpServer/qthttpserverglobal.h> + +#include <QtCore/qbytearray.h> + +QT_BEGIN_NAMESPACE + +class Q_HTTPSERVER_EXPORT QHttpServerLiterals +{ + +public: + static QByteArray contentTypeHeader(); + static QByteArray contentTypeXEmpty(); + static QByteArray contentTypeTextHtml(); + static QByteArray contentTypeJson(); + static QByteArray contentLengthHeader(); +}; + +QT_END_NAMESPACE + +#endif // QHTTPSERVERLITERALS_P_H diff --git a/src/httpserver/qhttpserverresponder.cpp b/src/httpserver/qhttpserverresponder.cpp index a25119d..5285233 100644 --- a/src/httpserver/qhttpserverresponder.cpp +++ b/src/httpserver/qhttpserverresponder.cpp @@ -30,6 +30,7 @@ #include <QtHttpServer/qhttpserverresponder.h> #include <QtHttpServer/qhttpserverrequest.h> #include <private/qhttpserverresponder_p.h> +#include <private/qhttpserverliterals_p.h> #include <private/qhttpserverrequest_p.h> #include <QtCore/qjsondocument.h> #include <QtCore/qloggingcategory.h> @@ -55,13 +56,6 @@ static const std::map<QHttpServerResponder::StatusCode, QByteArray> statusString #undef XX }; -static const QByteArray contentTypeHeader(QByteArrayLiteral("Content-Type")); -static const QByteArray contentLengthHeader(QByteArrayLiteral("Content-Length")); - -static const QByteArray contentTypeEmpty(QByteArrayLiteral("application/x-empty")); -static const QByteArray contentTypeJson(QByteArrayLiteral("text/json")); - - template <qint64 BUFFERSIZE = 512> struct IOChunkedTransfer { @@ -208,8 +202,10 @@ void QHttpServerResponder::write(QIODevice *data, writeStatusLine(status); - if (!input->isSequential()) // Non-sequential QIODevice should know its data size - writeHeader(contentLengthHeader, QByteArray::number(input->size())); + if (!input->isSequential()) { // Non-sequential QIODevice should know its data size + writeHeader(QHttpServerLiterals::contentLengthHeader(), + QByteArray::number(input->size())); + } for (auto &&header : headers) writeHeader(header.first, header.second); @@ -239,7 +235,9 @@ void QHttpServerResponder::write(QIODevice *data, const QByteArray &mimeType, StatusCode status) { - write(data, {{ contentTypeHeader, mimeType }}, status); + write(data, + {{ QHttpServerLiterals::contentTypeHeader(), mimeType }}, + status); } /*! @@ -253,9 +251,12 @@ void QHttpServerResponder::write(const QJsonDocument &document, StatusCode status) { const QByteArray &json = document.toJson(); + writeStatusLine(status); - writeHeader(contentTypeHeader, contentTypeJson); - writeHeader(contentLengthHeader, QByteArray::number(json.size())); + writeHeader(QHttpServerLiterals::contentTypeHeader(), + QHttpServerLiterals::contentTypeJson()); + writeHeader(QHttpServerLiterals::contentLengthHeader(), + QByteArray::number(json.size())); writeHeaders(std::move(headers)); writeBody(document.toJson()); } @@ -288,7 +289,8 @@ void QHttpServerResponder::write(const QByteArray &data, for (auto &&header : headers) writeHeader(header.first, header.second); - writeHeader(contentLengthHeader, QByteArray::number(data.size())); + writeHeader(QHttpServerLiterals::contentLengthHeader(), + QByteArray::number(data.size())); writeBody(data); } @@ -300,7 +302,9 @@ void QHttpServerResponder::write(const QByteArray &data, const QByteArray &mimeType, StatusCode status) { - write(data, {{ contentTypeHeader, mimeType }}, status); + write(data, + {{ QHttpServerLiterals::contentTypeHeader(), mimeType }}, + status); } /*! @@ -310,7 +314,7 @@ void QHttpServerResponder::write(const QByteArray &data, */ void QHttpServerResponder::write(StatusCode status) { - write(QByteArray(), contentTypeEmpty, status); + write(QByteArray(), QHttpServerLiterals::contentTypeXEmpty(), status); } /*! diff --git a/src/httpserver/qhttpserverresponse.cpp b/src/httpserver/qhttpserverresponse.cpp index e997e96..89d6b47 100644 --- a/src/httpserver/qhttpserverresponse.cpp +++ b/src/httpserver/qhttpserverresponse.cpp @@ -30,6 +30,7 @@ #include <QtHttpServer/qhttpserverresponse.h> #include <private/qhttpserverresponse_p.h> +#include <private/qhttpserverliterals_p.h> #include <QtCore/qfile.h> #include <QtCore/qjsondocument.h> @@ -38,20 +39,16 @@ QT_BEGIN_NAMESPACE -namespace { - -const QByteArray mimeTextHtml("text/html"); -const QByteArray mimeApplicationJson("application/json"); - -} - QHttpServerResponse::QHttpServerResponse(QHttpServerResponse &&other) : d_ptr(other.d_ptr.take()) { } -QHttpServerResponse::QHttpServerResponse(const QHttpServerResponse::StatusCode statusCode) - : QHttpServerResponse(mimeTextHtml, QByteArray(), statusCode) +QHttpServerResponse::QHttpServerResponse( + const QHttpServerResponse::StatusCode statusCode) + : QHttpServerResponse(QHttpServerLiterals::contentTypeTextHtml(), + QByteArray(), + statusCode) { } @@ -78,13 +75,13 @@ QHttpServerResponse::QHttpServerResponse(QByteArray &&data) } QHttpServerResponse::QHttpServerResponse(const QJsonObject &data) - : QHttpServerResponse(mimeApplicationJson, + : QHttpServerResponse(QHttpServerLiterals::contentTypeJson(), QJsonDocument(data).toJson(QJsonDocument::Compact)) { } QHttpServerResponse::QHttpServerResponse(const QJsonArray &data) - : QHttpServerResponse(mimeApplicationJson, + : QHttpServerResponse(QHttpServerLiterals::contentTypeJson(), QJsonDocument(data).toJson(QJsonDocument::Compact)) { } diff --git a/tests/auto/qhttpserver/tst_qhttpserver.cpp b/tests/auto/qhttpserver/tst_qhttpserver.cpp index 3103cb2..938e051 100644 --- a/tests/auto/qhttpserver/tst_qhttpserver.cpp +++ b/tests/auto/qhttpserver/tst_qhttpserver.cpp @@ -32,6 +32,7 @@ #include <QtHttpServer/qhttpserverrouterrule.h> #include <private/qhttpserverrouterrule_p.h> +#include <private/qhttpserverliterals_p.h> #include <QtTest/qtest.h> #include <QtTest/qsignalspy.h> @@ -111,7 +112,8 @@ struct CustomArg { void tst_QHttpServer::initTestCase() { httpserver.route("/test", [] (QHttpServerResponder &&responder) { - responder.write("test msg", "text/html"); + responder.write("test msg", + QHttpServerLiterals::contentTypeTextHtml()); }); httpserver.route("/", QHttpServerRequest::Method::Get, [] () { @@ -460,7 +462,8 @@ void tst_QHttpServer::routeKeepAlive() request.setUrl(urlBase.arg("/keep-alive?po=98")); request.setRawHeader("CustomHeader", "1"); - request.setHeader(QNetworkRequest::ContentTypeHeader, "text/html"); + request.setHeader(QNetworkRequest::ContentTypeHeader, + QHttpServerLiterals::contentTypeTextHtml()); checkReply(networkAccessManager.post(request, QByteArray("test")), QString("header: 1, query: po=98, body: test, method: %1") @@ -470,7 +473,8 @@ void tst_QHttpServer::routeKeepAlive() request = QNetworkRequest(urlBase.arg("/keep-alive")); request.setRawHeader(QByteArray("Connection"), QByteArray("keep-alive")); - request.setHeader(QNetworkRequest::ContentTypeHeader, "text/html"); + request.setHeader(QNetworkRequest::ContentTypeHeader, + QHttpServerLiterals::contentTypeTextHtml()); checkReply(networkAccessManager.post(request, QByteArray("")), QString("header: , query: , body: , method: %1") @@ -543,8 +547,10 @@ void tst_QHttpServer::routePost() QNetworkAccessManager networkAccessManager; QNetworkRequest request(QUrl(urlBase.arg(url))); - if (data.size()) - request.setHeader(QNetworkRequest::ContentTypeHeader, "text/html"); + if (data.size()) { + request.setHeader(QNetworkRequest::ContentTypeHeader, + QHttpServerLiterals::contentTypeTextHtml()); + } auto reply = networkAccessManager.post(request, data.toUtf8()); diff --git a/tests/auto/qhttpserverresponder/qhttpserverresponder.pro b/tests/auto/qhttpserverresponder/qhttpserverresponder.pro index 76ca847..e3031db 100644 --- a/tests/auto/qhttpserverresponder/qhttpserverresponder.pro +++ b/tests/auto/qhttpserverresponder/qhttpserverresponder.pro @@ -2,6 +2,6 @@ CONFIG += testcase TARGET = tst_qhttpserverresponder SOURCES += tst_qhttpserverresponder.cpp -QT = httpserver testlib +QT = httpserver httpserver-private testlib TESTDATA += *.html diff --git a/tests/auto/qhttpserverresponder/tst_qhttpserverresponder.cpp b/tests/auto/qhttpserverresponder/tst_qhttpserverresponder.cpp index 436a1c0..b6dd81f 100644 --- a/tests/auto/qhttpserverresponder/tst_qhttpserverresponder.cpp +++ b/tests/auto/qhttpserverresponder/tst_qhttpserverresponder.cpp @@ -30,6 +30,8 @@ #include <QtHttpServer/qhttpserverresponder.h> #include <QtHttpServer/qabstracthttpserver.h> +#include <private/qhttpserverliterals_p.h> + #include <QtCore/qjsondocument.h> #include <QtCore/qfile.h> #include <QtCore/qtemporaryfile.h> @@ -95,7 +97,7 @@ void tst_QHttpServerResponder::defaultStatusCodeNoParameters() void tst_QHttpServerResponder::defaultStatusCodeByteArray() { HttpServer server([](QHttpServerResponder responder) { - responder.write(QByteArray(), QByteArrayLiteral("application/x-empty")); + responder.write(QByteArray(), QHttpServerLiterals::contentTypeXEmpty()); }); auto reply = networkAccessManager->get(QNetworkRequest(server.url)); qWaitForFinished(reply); @@ -159,7 +161,8 @@ void tst_QHttpServerResponder::writeJson() auto reply = networkAccessManager->get(QNetworkRequest(server.url)); qWaitForFinished(reply); QCOMPARE(reply->error(), QNetworkReply::NoError); - QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), QByteArrayLiteral("text/json")); + QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), + QHttpServerLiterals::contentTypeJson()); QCOMPARE(QJsonDocument::fromJson(reply->readAll()), json); } @@ -172,7 +175,8 @@ void tst_QHttpServerResponder::writeJsonExtraHeader() auto reply = networkAccessManager->get(QNetworkRequest(server.url)); qWaitForFinished(reply); QCOMPARE(reply->error(), QNetworkReply::NoError); - QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), QByteArrayLiteral("text/json")); + QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), + QHttpServerLiterals::contentTypeJson()); QCOMPARE(reply->header(QNetworkRequest::ServerHeader), headerServerValue); QCOMPARE(QJsonDocument::fromJson(reply->readAll()), json); } @@ -213,7 +217,7 @@ void tst_QHttpServerResponder::writeFile() QSignalSpy spyDestroyIoDevice(iodevice, &QObject::destroyed); HttpServer server([&iodevice](QHttpServerResponder responder) { - responder.write(iodevice, "text/html"); + responder.write(iodevice, QHttpServerLiterals::contentTypeTextHtml()); }); auto reply = networkAccessManager->get(QNetworkRequest(server.url)); QTRY_VERIFY(reply->isFinished()); @@ -229,20 +233,23 @@ void tst_QHttpServerResponder::writeFileExtraHeader() { auto file = new QFile(QFINDTESTDATA("index.html"), this); QSignalSpy spyDestroyIoDevice(file, &QObject::destroyed); - const QByteArray contentType("text/html"); HttpServer server([=](QHttpServerResponder responder) { responder.write( file, { - { "Content-Type", contentType }, + { + QHttpServerLiterals::contentTypeHeader(), + QHttpServerLiterals::contentTypeTextHtml() + }, { headerServerString, headerServerValue } }); }); auto reply = networkAccessManager->get(QNetworkRequest(server.url)); QTRY_VERIFY(reply->isFinished()); - QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), contentType); + QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), + QHttpServerLiterals::contentTypeTextHtml()); QCOMPARE(reply->header(QNetworkRequest::ServerHeader), headerServerValue); QCOMPARE(reply->readAll().trimmed(), "<html></html>"); diff --git a/tests/auto/qhttpserverresponse/qhttpserverresponse.pro b/tests/auto/qhttpserverresponse/qhttpserverresponse.pro index dc0b359..97ac43e 100644 --- a/tests/auto/qhttpserverresponse/qhttpserverresponse.pro +++ b/tests/auto/qhttpserverresponse/qhttpserverresponse.pro @@ -2,6 +2,6 @@ CONFIG += testcase TARGET = tst_qhttpserverresponse SOURCES += tst_qhttpserverresponse.cpp -QT = httpserver testlib +QT = httpserver httpserver-private testlib TESTDATA += data/ diff --git a/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp b/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp index a7cd837..53b00ca 100644 --- a/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp +++ b/tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp @@ -29,6 +29,8 @@ #include <QtHttpServer/qhttpserverresponse.h> +#include <private/qhttpserverliterals_p.h> + #include <QtCore/qfile.h> #include <QtTest/qtest.h> @@ -60,7 +62,7 @@ void tst_QHttpServerResponse::mimeTypeDetection_data() QTest::addRow("text/html") << QFINDTESTDATA("data/text.html") - << QByteArrayLiteral("text/html"); + << QHttpServerLiterals::contentTypeTextHtml(); QTest::addRow("image/png") << QFINDTESTDATA("data/image.png") @@ -103,7 +105,7 @@ void tst_QHttpServerResponse::mimeTypeDetectionFromFile_data() QTest::addRow("text/html") << QFINDTESTDATA("data/text.html") - << QByteArrayLiteral("text/html"); + << QHttpServerLiterals::contentTypeTextHtml(); QTest::addRow("image/png") << QFINDTESTDATA("data/image.png") |