From b2aca491b6355daa1ef3b25ab43811d8bc432617 Mon Sep 17 00:00:00 2001 From: Kumamon38 <Kumamon38@users.noreply.github.com> Date: Tue, 16 Apr 2019 17:58:34 +0200 Subject: [PATCH] close method change and fix code (#28) * close method change and fix code * missing mutex --- ixwebsocket/IXWebSocketTransport.cpp | 34 ++++++++++++++-------------- ixwebsocket/IXWebSocketTransport.h | 4 +++- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/ixwebsocket/IXWebSocketTransport.cpp b/ixwebsocket/IXWebSocketTransport.cpp index f8cf64e5..8d309989 100644 --- a/ixwebsocket/IXWebSocketTransport.cpp +++ b/ixwebsocket/IXWebSocketTransport.cpp @@ -474,14 +474,8 @@ namespace ix std::string reason(_rxbuf.begin()+ws.header_size + 2, _rxbuf.begin()+ws.header_size + 2 + (size_t) ws.N); - { - std::lock_guard<std::mutex> lock(_closeDataMutex); - _closeCode = code; - _closeReason = reason; - _closeWireSize = _rxbuf.size(); - } - close(); + close(code, reason, _rxbuf.size()); } else { @@ -781,7 +775,12 @@ namespace ix _lastSendTimePoint = std::chrono::steady_clock::now(); } - void WebSocketTransport::close() + void WebSocketTransport::close(uint16_t code, const std::string& reason) + { + close(code, reason, 0); + } + + void WebSocketTransport::close(uint16_t code, const std::string& reason, size_t closeWireSize) { _requestInitCancellation = true; @@ -789,21 +788,22 @@ namespace ix // See list of close events here: // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent - // We use 1000: normal closure. - // - // >>> struct.pack('!H', 1000) - // b'\x03\xe8' - // - const std::string normalClosure = std::string("\x03\xe8"); + const std::string closure{(char)(code >> 8), (char)(code & 0xff)}; + bool compress = false; - sendData(wsheader_type::CLOSE, normalClosure, compress); + sendData(wsheader_type::CLOSE, closure, compress); setReadyState(CLOSING); _socket->wakeUpFromPoll(Socket::kCloseRequest); _socket->close(); - _closeCode = 1000; - _closeReason = "Normal Closure"; + { + std::lock_guard<std::mutex> lock(_closeDataMutex); + _closeCode = code; + _closeReason = reason; + _closeWireSize = closeWireSize; + } + setReadyState(CLOSED); } diff --git a/ixwebsocket/IXWebSocketTransport.h b/ixwebsocket/IXWebSocketTransport.h index 61e8c73f..0d1a84c9 100644 --- a/ixwebsocket/IXWebSocketTransport.h +++ b/ixwebsocket/IXWebSocketTransport.h @@ -81,7 +81,7 @@ namespace ix WebSocketSendInfo sendText(const std::string& message, const OnProgressCallback& onProgressCallback); WebSocketSendInfo sendPing(const std::string& message); - void close(); + void close(uint16_t code = 1000, const std::string& reason = "Normal closure"); ReadyStateValues getReadyState() const; void setReadyState(ReadyStateValues readyStateValue); void setOnCloseCallback(const OnCloseCallback& onCloseCallback); @@ -164,6 +164,8 @@ namespace ix // No data was send through the socket for longer than the heartbeat period bool heartBeatPeriodExceeded(); + void close(uint16_t code, const std::string& reason, size_t closeWireSize); + void sendOnSocket(); WebSocketSendInfo sendData(wsheader_type::opcode_type type, const std::string& message,