diff --git a/wpinet/src/main/native/cpp/WebSocket.cpp b/wpinet/src/main/native/cpp/WebSocket.cpp index ba57925a55..32f0f16c8a 100644 --- a/wpinet/src/main/native/cpp/WebSocket.cpp +++ b/wpinet/src/main/native/cpp/WebSocket.cpp @@ -126,6 +126,7 @@ void WebSocket::Close(uint16_t code, std::string_view reason) { SendClose(code, reason); if (m_state != FAILED && m_state != CLOSED) { m_state = CLOSING; + closed(code, reason); } } @@ -337,8 +338,11 @@ void WebSocket::SetClosed(uint16_t code, std::string_view reason, bool failed) { if (m_state == FAILED || m_state == CLOSED) { return; } + bool wasClosing = m_state == CLOSING; m_state = failed ? FAILED : CLOSED; - closed(code, reason); + if (!wasClosing) { + closed(code, reason); + } } void WebSocket::Shutdown() { diff --git a/wpinet/src/test/native/cpp/WebSocketIntegrationTest.cpp b/wpinet/src/test/native/cpp/WebSocketIntegrationTest.cpp index 5f6c8a54c9..e3e6b8b6cb 100644 --- a/wpinet/src/test/native/cpp/WebSocketIntegrationTest.cpp +++ b/wpinet/src/test/native/cpp/WebSocketIntegrationTest.cpp @@ -125,13 +125,13 @@ TEST_F(WebSocketIntegrationTest, ClientSendText) { ++gotData; ASSERT_EQ(data, "hello"); }); + ws.closed.connect([&](auto code, auto reason) { Finish(); }); }); }); clientPipe->Connect(pipeName, [&] { auto ws = WebSocket::CreateClient(*clientPipe, "/test", pipeName); ws->closed.connect([&](uint16_t code, std::string_view reason) { - Finish(); if (code != 1005 && code != 1006) { FAIL() << "Code: " << code << " Reason: " << reason; }