Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add optional keep-alive mechanism to WS connections #509

Open
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

paupuerta
Copy link

#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 */);

@crow-clang-format
Copy link

--- 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";
       });

@MichaelSB
Copy link
Contributor

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

@gittiver gittiver added the feature Code based project improvement label Jan 29, 2024
@gittiver gittiver added the need_rebase PR needs rebase on master branch label Feb 6, 2024
@@ -509,6 +517,7 @@ namespace crow
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_;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe use std::chrono for timeout type?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature Code based project improvement need_rebase PR needs rebase on master branch
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants