summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMikhail Svetkin <mikhail.svetkin@qt.io>2019-05-03 15:19:00 +0200
committerMikhail Svetkin <mikhail.svetkin@qt.io>2019-05-15 12:41:43 +0000
commite2c63563d51c0a53d8e516b94e14b2fd6af1b196 (patch)
tree6da80411899abf0bfd5d7e2784427511c7730ec9 /tests
parent3a811fc0ccb26f3d833e4cf19c98958c8aac38e5 (diff)
Fix crash for passing lambda with captures to QHttpServer::route
QHttpServer::route accepted the lambda by universal reference, but did not pass it to QHttpServerRouter::addRule by std::forward. We can not initialize lambda captures with C++11. So we always need to copy the lambda by value. Task-number: QTBUG-74882 Change-Id: I3e2dc6003624414d0ff45ba2e2f1af472e219ff1 Reviewed-by: MÃ¥rten Nordheim <marten.nordheim@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qhttpserver/tst_qhttpserver.cpp44
1 files changed, 36 insertions, 8 deletions
diff --git a/tests/auto/qhttpserver/tst_qhttpserver.cpp b/tests/auto/qhttpserver/tst_qhttpserver.cpp
index a1a9304..d1590f4 100644
--- a/tests/auto/qhttpserver/tst_qhttpserver.cpp
+++ b/tests/auto/qhttpserver/tst_qhttpserver.cpp
@@ -88,6 +88,10 @@ private slots:
void routeDelete_data();
void routeDelete();
void invalidRouterArguments();
+ void checkRouteLambdaCapture();
+
+private:
+ void checkReply(QNetworkReply *reply, const QString &response);
private:
QHttpServer httpserver;
@@ -377,14 +381,6 @@ void tst_QHttpServer::routeKeepAlive()
QNetworkRequest request(urlBase.arg("/keep-alive"));
request.setRawHeader(QByteArray("Connection"), QByteArray("keep-alive"));
- auto checkReply = [] (QNetworkReply *reply, const QString &response) {
- QTRY_VERIFY(reply->isFinished());
-
- QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), "text/plain");
- QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
- QCOMPARE(reply->readAll(), response);
- };
-
checkReply(networkAccessManager.get(request),
QString("header: , query: , body: , method: %1")
.arg(static_cast<int>(QHttpServerRequest::Method::Get)));
@@ -564,6 +560,38 @@ void tst_QHttpServer::invalidRouterArguments()
false);
}
+void tst_QHttpServer::checkRouteLambdaCapture()
+{
+ httpserver.route("/capture-this/", [this] () {
+ return urlBase;
+ });
+
+ QString msg = urlBase + "/pod";
+ httpserver.route("/capture-non-pod-data/", [&msg] () {
+ return msg;
+ });
+
+ QNetworkAccessManager networkAccessManager;
+ checkReply(networkAccessManager.get(QNetworkRequest(QUrl(urlBase.arg("/capture-this/")))),
+ urlBase);
+ if (QTest::currentTestFailed())
+ return;
+
+ checkReply(networkAccessManager.get(
+ QNetworkRequest(QUrl(urlBase.arg("/capture-non-pod-data/")))),
+ msg);
+ if (QTest::currentTestFailed())
+ return;
+}
+
+void tst_QHttpServer::checkReply(QNetworkReply *reply, const QString &response) {
+ QTRY_VERIFY(reply->isFinished());
+
+ QCOMPARE(reply->header(QNetworkRequest::ContentTypeHeader), "text/plain");
+ QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), 200);
+ QCOMPARE(reply->readAll(), response);
+};
+
QT_END_NAMESPACE
Q_DECLARE_METATYPE(CustomArg);