summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikhail Svetkin <mikhail.svetkin@gmail.com>2019-07-21 12:27:36 +0200
committerMikhail Svetkin <mikhail.svetkin@gmail.com>2019-08-21 22:07:26 +0200
commitf46cb8832f19a0a40cb9fb55a5a86d821daa962a (patch)
tree43e780a408a08607fe62ec4edb291c8e0f42d744
parent03f911fd0a4bb2768835fe16b9bef0893ccc25b9 (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.pro2
-rw-r--r--src/httpserver/qhttpserverliterals.cpp59
-rw-r--r--src/httpserver/qhttpserverliterals_p.h62
-rw-r--r--src/httpserver/qhttpserverresponder.cpp34
-rw-r--r--src/httpserver/qhttpserverresponse.cpp19
-rw-r--r--tests/auto/qhttpserver/tst_qhttpserver.cpp16
-rw-r--r--tests/auto/qhttpserverresponder/qhttpserverresponder.pro2
-rw-r--r--tests/auto/qhttpserverresponder/tst_qhttpserverresponder.cpp21
-rw-r--r--tests/auto/qhttpserverresponse/qhttpserverresponse.pro2
-rw-r--r--tests/auto/qhttpserverresponse/tst_qhttpserverresponse.cpp6
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")