Skip to content

Commit 2fbf81a

Browse files
committed
fixed bug in handling continuation frames.
1 parent d32b233 commit 2fbf81a

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

easywsclient.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ class _RealWebSocket : public easywsclient::WebSocket
162162

163163
std::vector<uint8_t> rxbuf;
164164
std::vector<uint8_t> txbuf;
165+
std::vector<uint8_t> receivedData;
165166

166167
socket_t sockfd;
167168
readyStateValues readyState;
@@ -292,10 +293,17 @@ class _RealWebSocket : public easywsclient::WebSocket
292293

293294
// We got a whole message, now do something with it:
294295
if (false) { }
295-
else if (ws.opcode == wsheader_type::TEXT_FRAME && ws.fin) {
296+
else if (ws.opcode == wsheader_type::TEXT_FRAME
297+
|| ws.opcode == wsheader_type::CONTINUATION
298+
) {
296299
if (ws.mask) { for (size_t i = 0; i != ws.N; ++i) { rxbuf[i+ws.header_size] ^= ws.masking_key[i&0x3]; } }
297-
std::string data(rxbuf.begin()+ws.header_size, rxbuf.begin()+ws.header_size+(size_t)ws.N);
298-
callable((const std::string) data);
300+
receivedData.insert(receivedData.end(), rxbuf.begin()+ws.header_size, rxbuf.begin()+ws.header_size+(size_t)ws.N);// just feed
301+
if (ws.fin) {
302+
std::string data(receivedData.begin(), receivedData.end());
303+
callable((const std::string) data);
304+
receivedData.erase(receivedData.begin(), receivedData.end());
305+
std::vector<uint8_t> ().swap(receivedData);// free memory
306+
}
299307
}
300308
else if (ws.opcode == wsheader_type::PING) {
301309
if (ws.mask) { for (size_t i = 0; i != ws.N; ++i) { rxbuf[i+ws.header_size] ^= ws.masking_key[i&0x3]; } }

0 commit comments

Comments
 (0)