@@ -55,13 +55,14 @@ namespace SL {
5555 }
5656 }
5757 template <class PARENTTYPE , class SOCKETTYPE >inline void startwrite (const PARENTTYPE& parent, const SOCKETTYPE& socket) {
58- if (!socket->SendMessageQueue .empty ()) {
59- socket->Writing = true ;
60- auto msg (socket->SendMessageQueue .front ());
61- write (parent, socket, msg.msg );
58+ if (!socket->SendMessageQueue .empty () && !socket->Writing ){
59+ socket->Writing = true ;
60+ auto msg (socket->SendMessageQueue .front ());
61+ socket->SendMessageQueue .pop_front ();
62+ write (parent, socket, msg.msg );
63+
6264 }
6365 else {
64- socket->Writing = false ;
6566 writeexpire_from_now (parent, socket, std::chrono::seconds (0 ));// make sure the write timer doesnt kick off
6667 }
6768 }
@@ -78,9 +79,8 @@ namespace SL {
7879 socket->SocketStatus_ = SocketStatus::CLOSING;
7980 }
8081 socket->SendMessageQueue .emplace_back (SendQueueItem{ msg, compressmessage });
81- if (!socket->Writing ) {
82- SL::WS_LITE::startwrite (parent, socket);
83- }
82+ SL::WS_LITE::startwrite (parent, socket);
83+
8484 }
8585 });
8686 }
@@ -96,48 +96,38 @@ namespace SL {
9696 sendImpl (parent, socket, ws, false );
9797 }
9898
99- template <class PARENTTYPE , class SOCKETTYPE , class SENDBUFFERTYPE >inline void handleclose (const PARENTTYPE& parent, const SOCKETTYPE& socket, const SENDBUFFERTYPE & msg) {
100- SL_WS_LITE_LOG (Logging_Levels::INFO_log_level, " Closed: " << msg. code );
99+ template <class PARENTTYPE , class SOCKETTYPE >inline void handleclose (const PARENTTYPE& parent, const SOCKETTYPE& socket, unsigned short code, const std::string & msg) {
100+ SL_WS_LITE_LOG (Logging_Levels::INFO_log_level, " Closed: " << code);
101101 socket->SocketStatus_ = SocketStatus::CLOSED;
102+ socket->Writing =false ;
102103 if (parent->onDisconnection ) {
103- parent->onDisconnection (socket, msg. code , " " );
104+ parent->onDisconnection (socket, code, msg );
104105 }
106+
105107 socket->SendMessageQueue .clear ();// clear all outbound messages
106108 socket->canceltimers ();
107109 std::error_code ec;
108110 socket->Socket .lowest_layer ().shutdown (asio::ip::tcp::socket::shutdown_both, ec);
109111 ec.clear ();
110112 socket->Socket .lowest_layer ().close (ec);
111113 }
112-
113- template <class PARENTTYPE , class SOCKETTYPE , class SENDBUFFERTYPE >void closeImpl (const PARENTTYPE& parent, const SOCKETTYPE& socket, unsigned short code, const std::string& msg, const SENDBUFFERTYPE& networkmsg) {
114- socket->Writing = false ;
115- if (networkmsg.code == OpCode::CLOSE) {
116- // failed when sending a close message... get out and notify
117- handleclose (parent, socket, networkmsg);
118- }
119- else {
120- sendclosemessage (parent, socket, code, msg);
121- }
122- }
114+
123115 template <class PARENTTYPE , class SOCKETTYPE , class SENDBUFFERTYPE >inline void write_end (const PARENTTYPE& parent, const SOCKETTYPE& socket, const SENDBUFFERTYPE& msg) {
124116
125117 asio::async_write (socket->Socket , asio::buffer (msg.data , msg.len ), socket->strand .wrap ([parent, socket, msg](const std::error_code& ec, size_t bytes_transferred) {
126- if (!socket->SendMessageQueue .empty ()) {
127- socket->SendMessageQueue .pop_front ();
118+ socket->Writing = false ;
119+ UNUSED (bytes_transferred);
120+ if (msg.code == OpCode::CLOSE) {
121+ // final close.. get out and dont come back mm kay?
122+ return handleclose (parent, socket, 1000 , " " );
128123 }
129- UNUSED (bytes_transferred);
130124 if (ec)
131125 {
132- return closeImpl (parent, socket, 1002 , " write header failed " + ec.message (), msg );
126+ return handleclose (parent, socket, 1002 , " write header failed " + ec.message ());
133127 }
134128 assert (msg.len == bytes_transferred);
135- if (msg.code == OpCode::CLOSE) {
136- handleclose (parent, socket, msg);
137- }
138- else {
139- startwrite (parent, socket);
140- }
129+ startwrite (parent, socket);
130+
141131 }));
142132 }
143133
@@ -158,10 +148,10 @@ namespace SL {
158148 if (ec)
159149 {
160150 if (msg.code == OpCode::CLOSE) {
161- handleclose (parent, socket, msg);
151+ return handleclose (parent, socket, msg. code , " " );
162152 }
163153 else {
164- return closeImpl (parent, socket, 1002 , " write mask failed " + ec.message (), msg );
154+ return handleclose (parent, socket, 1002 , " write mask failed " + ec.message ());
165155 }
166156 }
167157 else {
@@ -212,7 +202,7 @@ namespace SL {
212202 writeend (parent, socket, msg);
213203 }
214204 else {
215- return closeImpl (parent, socket, 1002 , " write header failed " + ec.message (), msg );
205+ handleclose (parent, socket, 1002 , " write header failed " + ec.message ());
216206 }
217207
218208 }
0 commit comments