diff options
author | Mikhail Svetkin <mikhail.svetkin@qt.io> | 2019-05-03 15:19:00 +0200 |
---|---|---|
committer | Mikhail Svetkin <mikhail.svetkin@qt.io> | 2019-05-15 12:41:43 +0000 |
commit | e2c63563d51c0a53d8e516b94e14b2fd6af1b196 (patch) | |
tree | 6da80411899abf0bfd5d7e2784427511c7730ec9 /src | |
parent | 3a811fc0ccb26f3d833e4cf19c98958c8aac38e5 (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.h | 16 |
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> |