From e2c63563d51c0a53d8e516b94e14b2fd6af1b196 Mon Sep 17 00:00:00 2001 From: Mikhail Svetkin Date: Fri, 3 May 2019 15:19:00 +0200 Subject: Fix crash for passing lambda with captures to QHttpServer::route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- tests/auto/qhttpserver/tst_qhttpserver.cpp | 44 ++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 8 deletions(-) (limited to 'tests') 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(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); -- cgit v1.2.3