@@ -83,10 +83,15 @@ int LibwebsocketsWebsocket::Callback(struct lws* wsi, enum lws_callback_reasons
83
83
case LWS_CALLBACK_CLIENT_RECEIVE: {
84
84
lwsl_debug (" Data received.\n " );
85
85
lwsl_hexdump_debug (in, len);
86
+ const size_t remaining = lws_remaining_packet_payload (wsi);
86
87
auto * uint8_ptr = static_cast <uint8_t *>(in);
87
- std::vector<uint8_t > data;
88
- data.assign (uint8_ptr, uint8_ptr + len);
89
- self->observer_ ->OnWebsocketBinaryReceived (data);
88
+ // Messages can be fragmented if the size exceeds max bytes
89
+ // Therefore, it needs to handle fragmented message.
90
+ self->received_data_buffer_ .insert (self->received_data_buffer_ .end (), uint8_ptr, uint8_ptr + len);
91
+ if (!remaining && lws_is_final_fragment (wsi)) {
92
+ self->observer_ ->OnWebsocketBinaryReceived (self->received_data_buffer_ );
93
+ self->received_data_buffer_ .clear ();
94
+ }
90
95
break ;
91
96
}
92
97
@@ -136,6 +141,7 @@ int LibwebsocketsWebsocket::Callback(struct lws* wsi, enum lws_callback_reasons
136
141
break ;
137
142
}
138
143
case LWS_CALLBACK_CLIENT_WRITEABLE: {
144
+ // TODO: Check if this can be also fragmented
139
145
if (!self->message_queue_ .empty ()) {
140
146
std::vector<uint8_t > data = self->message_queue_ .front ();
141
147
self->message_queue_ .pop ();
@@ -238,6 +244,7 @@ void LibwebsocketsWebsocket::Poll() { lws_service(context_, 0); }
238
244
239
245
void LibwebsocketsWebsocket::Close () {
240
246
if (!context_) return ;
247
+
241
248
lws_context_destroy (context_);
242
249
lwsl_user (" Closed\n " );
243
250
}
@@ -248,6 +255,7 @@ void LibwebsocketsWebsocket::SendBinary(const std::vector<uint8_t>& data) {
248
255
// Triggers LWS_CALLBACK_CLIENT_WRITEABLE event in Callback when socket is ready to accept data.
249
256
lws_callback_on_writable (wsi_);
250
257
}
258
+
251
259
int LibwebsocketsWebsocket::ConvertLogLevel (LogLevel level) {
252
260
int lws_level = 0 ;
253
261
switch (level) {
@@ -267,7 +275,7 @@ int LibwebsocketsWebsocket::ConvertLogLevel(LogLevel level) {
267
275
return lws_level;
268
276
}
269
277
270
- void LibwebsocketsWebsocket::HandleError (std::string error_description) {
278
+ void LibwebsocketsWebsocket::HandleError (const std::string& error_description) {
271
279
lwsl_err (" %s" , error_description.c_str ());
272
280
WebsocketErrorStatus error_status;
273
281
error_status.description = error_description;
0 commit comments