From e269cde1d46c5e5c790fbed008c370251f391d4c Mon Sep 17 00:00:00 2001 From: awwit Date: Wed, 30 Mar 2022 00:13:42 +0300 Subject: [PATCH] refactor: unmask websocket frame without reallocation --- .gitignore | 2 ++ src/server/protocol/WebSocket.cpp | 16 ++++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 378eac2..707f4da 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ build +projects/build* +projects/qt-creator/*.user diff --git a/src/server/protocol/WebSocket.cpp b/src/server/protocol/WebSocket.cpp index f80fac4..58bffd4 100644 --- a/src/server/protocol/WebSocket.cpp +++ b/src/server/protocol/WebSocket.cpp @@ -112,25 +112,21 @@ namespace HttpClient cur_pos += sizeof(uint32_t); } - const uint8_t align = (recv_size - cur_pos) % sizeof(uint32_t); - - frame.reserve(recv_size - cur_pos + align); + frame.reserve(recv_size - cur_pos); frame.assign(buf.cbegin() + cur_pos, buf.cbegin() + recv_size); if (is_mask_set) { - if (align) { - frame.insert(frame.cend(), align, 0); - } + const size_t aligned = frame.size() - (frame.size() % sizeof(mask)); - uint32_t *addr = reinterpret_cast(frame.data() ); + uint32_t * const addr = reinterpret_cast(frame.data() ); - for (size_t i = 0; i < frame.size() / sizeof(uint32_t); ++i) { + for (size_t i = 0; i < aligned / sizeof(uint32_t); ++i) { addr[i] ^= mask; } - if (align) { - frame.erase(frame.cend() - align, frame.cend() ); + for (size_t i = aligned; i < frame.size(); ++i) { + frame[i] ^= reinterpret_cast(&mask)[i % sizeof(mask)]; } }