Crow icon indicating copy to clipboard operation
Crow copied to clipboard

Add optional keep-alive mechanism to WS connections

Open paupuerta opened this issue 3 years ago • 2 comments

#506 To be able to keepalive to WS connections, this PR adds a new callback to allow do something every x seconds while not receiving messages.

CROW_WEBSOCKET_ROUTE(app, "/ws")
      .onaccept([&](const crow::request& req, void**) { .... })
      .onopen([&](websocket::connection&) { .... })
      .onmessage([&](websocket::connection& conn, const std::string& message, bool isbin) { .... })
      .onclose([&](websocket::connection&, const std::string&) { .... })
      .ontimeout([&](websocket::connection& conn, const std::string&) {
          // conn.send_text("TimeOut"); or conn.close(); or
          conn.send_ping("");
      }, 5 /* every seconds */);

paupuerta avatar Jul 25 '22 10:07 paupuerta

--- include/crow/websocket.h	(before formatting)
+++ include/crow/websocket.h	(after formatting)
@@ -261,7 +261,7 @@
                 do_read();
             }
 
-            void start_deadline(/*int timeout = 5*/) 
+            void start_deadline(/*int timeout = 5*/)
             {
                 cancel_deadline_timer();
 
@@ -711,7 +711,7 @@
             std::function<void(crow::websocket::connection&, const std::string&, bool)> message_handler_;
             std::function<void(crow::websocket::connection&, const std::string&)> close_handler_;
             std::function<void(crow::websocket::connection&, const std::string&)> error_handler_;
-            std::pair<std::function<void(crow::websocket::connection&, const std::string&)>,uint64_t> timeout_handler_;
+            std::pair<std::function<void(crow::websocket::connection&, const std::string&)>, uint64_t> timeout_handler_;
             std::function<bool(const crow::request&, void**)> accept_handler_;
 
             detail::task_timer task_timer_;
--- tests/unittest.cpp	(before formatting)
+++ tests/unittest.cpp	(after formatting)
@@ -2499,7 +2499,8 @@
       .ontimeout([&](websocket::connection& conn, const std::string&) {
           CROW_LOG_INFO << "Websocket Time Out";
           conn.send_text("TimeOut");
-      }, 2 /* seconds */)
+      },
+                 2 /* seconds */)
       .onclose([&](websocket::connection&, const std::string&) {
           CROW_LOG_INFO << "Closing websocket";
       });

crow-clang-format[bot] avatar Jul 25 '22 10:07 crow-clang-format[bot]

That's useful I think. What's the purpose of the string argument of the timeout handler? It's hardcoded to the string "timeout"?

MichaelSB avatar Jul 10 '23 12:07 MichaelSB