@@ -162,6 +162,7 @@ class _RealWebSocket : public easywsclient::WebSocket
162
162
163
163
std::vector<uint8_t > rxbuf;
164
164
std::vector<uint8_t > txbuf;
165
+ std::vector<uint8_t > receivedData;
165
166
166
167
socket_t sockfd;
167
168
readyStateValues readyState;
@@ -292,10 +293,17 @@ class _RealWebSocket : public easywsclient::WebSocket
292
293
293
294
// We got a whole message, now do something with it:
294
295
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
+ ) {
296
299
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
+ }
299
307
}
300
308
else if (ws.opcode == wsheader_type::PING) {
301
309
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