Skip to content

Commit 273fa73

Browse files
committed
Updates
1 parent f783b62 commit 273fa73

File tree

4 files changed

+46
-66
lines changed

4 files changed

+46
-66
lines changed

Test/fuzzingclient.json

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
{
2-
"options": { "failByDrop": false },
3-
"outdir": "../../Test/autobahn",
4-
"servers": [
5-
{
6-
{
7-
"agent": "WebSockets SSL",
8-
"url": "wss://localhost:3001",
9-
"options": { "version": 18 }
10-
},
11-
{
12-
"agent": "WebSockets",
13-
"url": "ws://localhost:3000",
14-
"options": { "version": 18 }
15-
},
2+
"options": {"failByDrop": false},
3+
"outdir": "../../../Projects_Setup/websocket_lite",
4+
"servers": [
5+
{"agent": "WebSockets SSL",
6+
"url": "wss://localhost:3001",
7+
"options": {"version": 18}},
8+
{"agent": "WebSockets",
9+
"url": "ws://localhost:3000",
10+
"options": {"version": 18}}
11+
],
1612

17-
18-
"cases": [ "1.*", "2.*", "3.*", "4.*", "5.*", "6.*", "7.*", "9.*", "10.*" ],
19-
"exclude-cases": [],
20-
"exclude-agent-cases": {}
21-
}
13+
"cases": ["1.*","2.*","3.*","4.*", "5.*", "6.*", "7.*", "9.*", "10.*"],
14+
"exclude-cases": [],
15+
"exclude-agent-cases": {}
16+
}

include/internal/DataStructures.h

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@ namespace WS_LITE {
2424
void sendImpl(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, const SENDBUFFERTYPE &msg, bool compressmessage);
2525
template <bool isServer, class SOCKETTYPE>
2626
void sendclosemessage(const std::shared_ptr<WSContextImpl> parent, const SOCKETTYPE &socket, unsigned short code, const std::string &msg);
27-
28-
struct HandshakeContainer {
29-
asio::streambuf Read;
30-
asio::streambuf Write;
31-
std::unordered_map<std::string, std::string> Header;
32-
};
27+
3328
struct WSSendMessageInternal {
3429
unsigned char *data;
3530
size_t len;

include/internal/WebSocketProtocol.h

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

src/ListenerImpl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
namespace SL {
66
namespace WS_LITE {
77

8+
struct HandshakeContainer {
9+
asio::streambuf Read;
10+
asio::streambuf Write;
11+
std::unordered_map<std::string, std::string> Header;
12+
};
13+
814
template <class SOCKETTYPE> void read_handshake(const std::shared_ptr<WSContextImpl> listener, const SOCKETTYPE &socket)
915
{
1016
auto handshakecontainer(std::make_shared<HandshakeContainer>());

0 commit comments

Comments
 (0)