summaryrefslogtreecommitdiffstats
path: root/src
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 /src
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 'src')
-rw-r--r--src/httpserver/qhttpserver.h16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/httpserver/qhttpserver.h b/src/httpserver/qhttpserver.h
index 7f61a2a..885c150 100644
--- a/src/httpserver/qhttpserver.h
+++ b/src/httpserver/qhttpserver.h
@@ -88,15 +88,17 @@ private:
template<typename Rule, typename ViewHandler, typename ViewTraits, typename ... Args>
bool routeImpl(Args &&...args, ViewHandler &&viewHandler)
{
- return router()->addRule<ViewHandler, ViewTraits>(
- new Rule(std::forward<Args>(args)..., [this, &viewHandler] (
- QRegularExpressionMatch &match,
- const QHttpServerRequest &request,
- QTcpSocket *socket) {
+ auto routerHandler = [this, viewHandler] (
+ QRegularExpressionMatch &match,
+ const QHttpServerRequest &request,
+ QTcpSocket *socket) mutable {
auto boundViewHandler = router()->bindCaptured<ViewHandler, ViewTraits>(
- std::forward<ViewHandler>(viewHandler), match);
+ std::move(viewHandler), match);
responseImpl<ViewTraits>(boundViewHandler, request, socket);
- }));
+ };
+
+ return router()->addRule<ViewHandler, ViewTraits>(
+ new Rule(std::forward<Args>(args)..., std::move(routerHandler)));
}
template<typename ViewTraits, typename T>