From e808332e12c01b3cdcc63d93ed68371fdb3d1e60 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Fri, 12 Dec 2025 18:11:17 +0000 Subject: [PATCH] Reply to WS_PING with WS_PONG to fix OSD websocket disconnections --- src/client/http_client.cpp | 18 ++++++++++++------ src/client/http_client.h | 4 ++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/client/http_client.cpp b/src/client/http_client.cpp index 1001c570..f8a53786 100644 --- a/src/client/http_client.cpp +++ b/src/client/http_client.cpp @@ -23,7 +23,7 @@ #define READ_BUFFER_SIZE 9000 static std::string ws_format_frame(int type, uint64_t size); -static bool ws_parse_frame(std::string & buf, int & type, std::string & res); +static bool ws_parse_frame(std::string & buf, uint8_t & type, std::string & res); static void parse_http_headers(std::string & res, http_response_t *parsed); struct http_co_t @@ -70,7 +70,7 @@ struct http_co_t void submit_read(bool check_timeout); void submit_send(); bool handle_read(); - void post_message(int type, const std::string & msg); + void post_message(uint8_t type, const std::string & msg); void send_request(const std::string & host, const std::string & request, const http_options_t & options, std::function response_callback); }; @@ -199,12 +199,12 @@ void http_co_t::send_request(const std::string & host, const std::string & reque stackout(); } -void http_post_message(http_co_t *handler, int type, const std::string & msg) +void http_post_message(http_co_t *handler, uint8_t type, const std::string & msg) { handler->post_message(type, msg); } -void http_co_t::post_message(int type, const std::string & msg) +void http_co_t::post_message(uint8_t type, const std::string & msg) { stackin(); if (state == HTTP_CO_WEBSOCKET) @@ -608,7 +608,13 @@ bool http_co_t::handle_read() { while (ws_parse_frame(response, parsed.ws_msg_type, parsed.body)) { - response_callback(&parsed); + if (parsed.ws_msg_type == WS_PING) + { + // Reply with WS_PONG + post_message(WS_PONG, ""); + } + else + response_callback(&parsed); parsed.body = ""; } } @@ -698,7 +704,7 @@ static std::string ws_format_frame(int type, uint64_t size) return res; } -static bool ws_parse_frame(std::string & buf, int & type, std::string & res) +static bool ws_parse_frame(std::string & buf, uint8_t & type, std::string & res) { uint64_t hdr = 2; if (buf.size() < hdr) diff --git a/src/client/http_client.h b/src/client/http_client.h index b57d3a4c..c7e4c91b 100644 --- a/src/client/http_client.h +++ b/src/client/http_client.h @@ -32,7 +32,7 @@ struct http_response_t int status_code = 0; std::string status_line; std::map headers; - int ws_msg_type = -1; + uint8_t ws_msg_type = -1; std::string body; void parse_json_response(std::string & error, json11::Json & r) const; @@ -46,5 +46,5 @@ http_co_t* open_websocket(timerfd_manager_t *tfd, const std::string & host, cons int timeout, std::function on_message); void http_request(http_co_t *handler, const std::string & host, const std::string & request, const http_options_t & options, std::function response_callback); -void http_post_message(http_co_t *handler, int type, const std::string & msg); +void http_post_message(http_co_t *handler, uint8_t type, const std::string & msg); void http_close(http_co_t *co);