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,