From f8e95e46c937bb8cd189e366be791d916444dde8 Mon Sep 17 00:00:00 2001 From: kokekanon <114332266+kokekanon@users.noreply.github.com> Date: Sun, 28 Sep 2025 22:14:34 -0300 Subject: [PATCH] test --- src/framework/net/protocolhttp.cpp | 69 +++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 10 deletions(-) diff --git a/src/framework/net/protocolhttp.cpp b/src/framework/net/protocolhttp.cpp index 4b76ac371..97e4b9b55 100644 --- a/src/framework/net/protocolhttp.cpp +++ b/src/framework/net/protocolhttp.cpp @@ -388,6 +388,35 @@ int Http::ws(const std::string& url, int timeout) if (msg->type == ix::WebSocketMessageType::Open) { result->connected = true; + std::shared_ptr currentSocket; + std::vector pending; + { + std::lock_guard lock(m_mutex); + const auto it = m_websockets.find(operationId); + if (it != m_websockets.end()) { + currentSocket = it->second; + } + while (!result->pendingMessages.empty()) { + pending.emplace_back(std::move(result->pendingMessages.front())); + result->pendingMessages.pop(); + } + } + + if (currentSocket) { + for (const auto& payload : pending) { + const auto info = currentSocket->send(payload); + if (!info.success) { + std::lock_guard lock(m_mutex); + result->pendingMessages.push(payload); + break; + } + } + } else { + std::lock_guard lock(m_mutex); + for (const auto& payload : pending) { + result->pendingMessages.push(payload); + } + } g_dispatcher.addEvent([result] { g_lua.callGlobalField("g_http", "onWsOpen", result->operationId, "code::websocket_open"); }); @@ -405,19 +434,26 @@ int Http::ws(const std::string& url, int timeout) if (msg->type == ix::WebSocketMessageType::Error) { result->error = msg->errorInfo.reason; const std::string errorReason = fmt::format("close_code::error {}", result->error); - g_dispatcher.addEvent([result, errorReason] { + g_dispatcher.addEvent([this, operationId, result, errorReason] { + { + std::lock_guard lock(m_mutex); + m_websockets.erase(operationId); + m_operations.erase(operationId); + result->connected = false; + } g_lua.callGlobalField("g_http", "onWsError", result->operationId, errorReason); }); } if (msg->type == ix::WebSocketMessageType::Close) { const std::string closeMessage = "close_code::normal"; - { - std::lock_guard lock(m_mutex); - m_websockets.erase(operationId); - m_operations.erase(operationId); - } - g_dispatcher.addEvent([result, closeMessage] { + g_dispatcher.addEvent([this, operationId, result, closeMessage] { + { + std::lock_guard lock(m_mutex); + m_websockets.erase(operationId); + m_operations.erase(operationId); + result->connected = false; + } g_lua.callGlobalField("g_http", "onWsClose", result->operationId, closeMessage); }); } @@ -436,21 +472,34 @@ int Http::ws(const std::string& url, int timeout) bool Http::wsSend(int operationId, const std::string& message) { std::shared_ptr websocket; + HttpResult_ptr result; + { std::lock_guard lock(m_mutex); const auto it = m_websockets.find(operationId); if (it != m_websockets.end()) { websocket = it->second; } + const auto oit = m_operations.find(operationId); + if (oit != m_operations.end()) { + result = oit->second; + } + if (result && !result->connected) { + result->pendingMessages.push(message); + return true; + } } if (!websocket) return false; - websocket->send(message); - return true; + const auto info = websocket->send(message); + if (!info.success && result) { + std::lock_guard lock(m_mutex); + result->pendingMessages.push(message); + } + return info.success; } - bool Http::wsClose(int operationId) { cancel(operationId); -- 2.44.0.windows.1