Skip to content

Commit 0ce16c5

Browse files
committed
fixing websockets
1 parent 19964e2 commit 0ce16c5

File tree

1 file changed

+25
-35
lines changed

1 file changed

+25
-35
lines changed

include/internal/WebSocketProtocol.h

Lines changed: 25 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)