@@ -17,6 +17,22 @@ namespace WS_LITE {
1717 template <bool isServer, class SOCKETTYPE , class SENDBUFFERTYPE >
1818 void write_end (const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const SENDBUFFERTYPE &msg);
1919
20+ inline size_t ReadFromExtraData (unsigned char *dst, size_t desired_bytes_to_read, const std::shared_ptr<asio::streambuf> &extradata)
21+ {
22+ size_t dataconsumed = 0 ;
23+ if (extradata->size () >= desired_bytes_to_read) {
24+ dataconsumed = desired_bytes_to_read;
25+ }
26+ else {
27+ dataconsumed = extradata->size ();
28+ }
29+ if (dataconsumed > 0 ) {
30+ desired_bytes_to_read -= dataconsumed;
31+ memcpy (dst, asio::buffer_cast<const void *>(extradata->data ()), dataconsumed);
32+ extradata->consume (dataconsumed);
33+ }
34+ return dataconsumed;
35+ }
2036 template <bool isServer, class SOCKETTYPE >
2137 void readexpire_from_now (const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, std::chrono::seconds secs)
2238 {
@@ -396,17 +412,10 @@ namespace WS_LITE {
396412 }
397413 else if (size > 0 ) {
398414 auto buffer = std::shared_ptr<unsigned char >(new unsigned char [size], [](auto p) { delete[] p; });
399- size_t dataconsumed = 0 ;
400- size_t bytestoread = size;
401- if (extradata->size () >= size) {
402- dataconsumed = size;
403- }
404- else {
405- dataconsumed = extradata->size ();
406- }
415+
416+ auto bytestoread = size;
417+ auto dataconsumed = ReadFromExtraData (buffer.get (), bytestoread, extradata);
407418 bytestoread -= dataconsumed;
408- memcpy (buffer.get (), asio::buffer_cast<const void *>(extradata->data ()), dataconsumed);
409- extradata->consume (dataconsumed);
410419
411420 asio::async_read (socket->Socket , asio::buffer (buffer.get () + dataconsumed, bytestoread),
412421 [size, extradata, parent, socket, buffer](const std::error_code &ec, size_t ) {
@@ -448,17 +457,11 @@ namespace WS_LITE {
448457 SL_WS_LITE_LOG (Logging_Levels::ERROR_log_level, " MEMORY ALLOCATION ERROR!!! Tried to realloc " << socket->ReceiveBufferSize );
449458 return sendclosemessage<isServer>(parent, socket, 1009 , " Payload exceeded MaxPayload size" );
450459 }
451- size_t dataconsumed = 0 ;
452- size_t bytestoread = size;
453- if (extradata->size () >= size) {
454- dataconsumed = size;
455- }
456- else {
457- dataconsumed = extradata->size ();
458- }
460+
461+ auto bytestoread = size;
462+ auto dataconsumed = ReadFromExtraData (socket->ReceiveBuffer + socket->ReceiveBufferSize - size, bytestoread, extradata);
459463 bytestoread -= dataconsumed;
460- memcpy (socket->ReceiveBuffer + socket->ReceiveBufferSize - size, asio::buffer_cast<const void *>(extradata->data ()), dataconsumed);
461- extradata->consume (dataconsumed);
464+
462465 asio::async_read (socket->Socket , asio::buffer (socket->ReceiveBuffer + socket->ReceiveBufferSize - size + dataconsumed, bytestoread),
463466 [size, extradata, parent, socket](const std::error_code &ec, size_t ) {
464467 if (!ec) {
@@ -485,19 +488,9 @@ namespace WS_LITE {
485488 void ReadHeaderNext (const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const std::shared_ptr<asio::streambuf> &extradata)
486489 {
487490 readexpire_from_now<isServer>(parent, socket, parent->ReadTimeout );
488- size_t dataconsumed = 0 ;
489491 size_t bytestoread = 2 ;
490-
491- if (extradata->size () > 1 ) {
492- dataconsumed = 2 ;
493- }
494- else if (extradata->size () == 1 ) {
495- dataconsumed = 1 ;
496- }
497- // zero is not possible
492+ auto dataconsumed = ReadFromExtraData (socket->ReceiveHeader , bytestoread, extradata);
498493 bytestoread -= dataconsumed;
499- memcpy (socket->ReceiveHeader , asio::buffer_cast<const void *>(extradata->data ()), dataconsumed);
500- extradata->consume (dataconsumed);
501494
502495 asio::async_read (socket->Socket , asio::buffer (socket->ReceiveHeader + dataconsumed, bytestoread),
503496 [parent, socket, extradata](const std::error_code &ec, size_t readdata) {
@@ -514,17 +507,8 @@ namespace WS_LITE {
514507 bytestoread = 0 ;
515508 }
516509 if (bytestoread > 1 ) {
517- size_t dataconsumed = 0 ;
518- if (extradata->size () > 1 ) {
519- dataconsumed = 2 ;
520- }
521- else if (extradata->size () == 1 ) {
522- dataconsumed = 1 ;
523- }
510+ auto dataconsumed = ReadFromExtraData (socket->ReceiveHeader + 2 , bytestoread, extradata);
524511 bytestoread -= dataconsumed;
525- memcpy (socket->ReceiveHeader + 2 , asio::buffer_cast<const void *>(extradata->data ()), dataconsumed);
526- extradata->consume (dataconsumed);
527- memset (socket->ReceiveHeader + 2 , 255 , 2 );
528512
529513 asio::async_read (socket->Socket , asio::buffer (socket->ReceiveHeader + 2 + dataconsumed, bytestoread),
530514 [parent, socket, extradata](const std::error_code &ec, size_t readdata) {
0 commit comments