From 91925ccc375aa6425cfd81754f7f2bd89f7e900a Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Wed, 23 Jan 2019 12:19:44 +0100 Subject: [PATCH] Make all websocket handlers move-only --- src/App.h | 22 +++++++++++----------- src/WebSocketContextData.h | 8 +++++--- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/App.h b/src/App.h index 1236af7..7e1d469 100644 --- a/src/App.h +++ b/src/App.h @@ -92,12 +92,12 @@ public: CompressOptions compression = DISABLED; int maxPayloadLength = 16 * 1024; int idleTimeout = 120; - std::function *, HttpRequest *)> open = nullptr; - std::function *, std::string_view, uWS::OpCode)> message = nullptr; - std::function *)> drain = nullptr; - std::function *)> ping = nullptr; - std::function *)> pong = nullptr; - std::function *, int, std::string_view)> close = nullptr; + fu2::unique_function *, HttpRequest *)> open = nullptr; + fu2::unique_function *, std::string_view, uWS::OpCode)> message = nullptr; + fu2::unique_function *)> drain = nullptr; + fu2::unique_function *)> ping = nullptr; + fu2::unique_function *)> pong = nullptr; + fu2::unique_function *, int, std::string_view)> close = nullptr; }; template @@ -126,19 +126,19 @@ public: } /* Copy all handlers */ - webSocketContext->getExt()->messageHandler = behavior.message; - webSocketContext->getExt()->drainHandler = behavior.drain; - webSocketContext->getExt()->closeHandler = behavior.close; + webSocketContext->getExt()->messageHandler = std::move(behavior.message); + webSocketContext->getExt()->drainHandler = std::move(behavior.drain); + webSocketContext->getExt()->closeHandler = std::move(behavior.close); /* Copy settings */ webSocketContext->getExt()->maxPayloadLength = behavior.maxPayloadLength; webSocketContext->getExt()->idleTimeout = behavior.idleTimeout; - return std::move(get(pattern, [webSocketContext, this, behavior](auto *res, auto *req) { + return std::move(get(pattern, [webSocketContext, this, behavior = std::move(behavior)](auto *res, auto *req) mutable { /* If we have this header set, it's a websocket */ std::string_view secWebSocketKey = req->getHeader("sec-websocket-key"); if (secWebSocketKey.length()) { - // note: OpenSSL can be used here to speed this up somewhat + /* Note: OpenSSL can be used here to speed this up somewhat */ char secWebSocketAccept[29] = {}; WebSocketHandshake::generate(secWebSocketKey.data(), secWebSocketAccept); diff --git a/src/WebSocketContextData.h b/src/WebSocketContextData.h index 85eff4b..07cc792 100644 --- a/src/WebSocketContextData.h +++ b/src/WebSocketContextData.h @@ -23,6 +23,8 @@ #include "WebSocketProtocol.h" +#include "f2/function2.hpp" + namespace uWS { template struct WebSocket; @@ -32,9 +34,9 @@ template struct WebSocket; template struct WebSocketContextData { /* The callbacks for this context */ - std::function *, std::string_view, uWS::OpCode)> messageHandler = nullptr; - std::function *)> drainHandler = nullptr; - std::function *, int, std::string_view)> closeHandler = nullptr; + fu2::unique_function *, std::string_view, uWS::OpCode)> messageHandler = nullptr; + fu2::unique_function *)> drainHandler = nullptr; + fu2::unique_function *, int, std::string_view)> closeHandler = nullptr; /* Settings for this context */ size_t maxPayloadLength = 0;