2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "web/websocket/Transmitter.h"
44#ifndef DOXYGEN_SHOULD_SKIP_THIS
46#include "log/Logger.h"
47#include "utils/hexdump.h"
55#ifndef WSMAXFRAMEPAYLOADLENGTH
56#define WSMAXFRAMEPAYLOADLENGTH 16384
69 send(true, opCode
, message
, messageLength
);
73 send(false, opCode
, message
, messageLength
);
88 void Transmitter::
send(
bool end, uint8_t opCode,
const char* message, std::size_t messageLength) {
89 std::size_t messageOffset = 0;
92 const std::size_t sendFrameLength =
95 const bool fin = (sendFrameLength == messageLength - messageOffset) && end;
99 messageOffset += sendFrameLength;
102 }
while (messageLength - messageOffset > 0);
110 if (payloadLength < 126) {
111 length = payloadLength;
112 }
else if (payloadLength < 0x10000) {
119 header[0] =
static_cast<
char>((fin ? 0b10000000 : 0) | opCode);
121 header[1] =
static_cast<
char>((
masking ? 0b10000000 : 0) | length);
141 if (payloadLength > 0) {
142 LOG(TRACE) <<
"WebSocket send: Frame data\n" <<
utils::hexDump(payload
, payloadLength
, 32
, true);
148 std::vector<
char> maskedPayload(payload, payload + payloadLength);
149 for (uint64_t i = 0; i < payloadLength; i++) {
150 maskedPayload[
static_cast<std::size_t>(i)] =
151 static_cast<
char>(maskedPayload[
static_cast<std::size_t>(i)] ^ maskingKeyAsArray.keyAsBytes[i % 4]);
167 uint16_t sendData = htobe16(data);
174 uint32_t sendData = htobe32(data);
181 uint64_t sendData = htobe64(data);
188 uint64_t frameOffset = 0;
191 const std::size_t sendChunkLen =
192 (frameLength - frameOffset <= SIZE_MAX) ?
static_cast<std::size_t>(frameLength - frameOffset) : SIZE_MAX;
196 frameOffset += sendChunkLen;
197 }
while (frameLength - frameOffset > 0);
#define WSMAXFRAMEPAYLOADLENGTH
void sendMessageEnd(const char *message, std::size_t messageLength)
void sendFrameData(const char *frame, uint64_t frameLength) const
std::random_device randomDevice
void sendFrameData(uint8_t data) const
Transmitter(bool masking)
void sendFrameData(uint16_t data) const
void sendMessage(uint8_t opCode, const char *message, std::size_t messageLength)
void sendFrameData(uint32_t data) const
virtual void sendFrameChunk(const char *data, std::size_t dataLength) const =0
void send(bool end, uint8_t opCode, const char *message, std::size_t messageLength)
void sendFrame(bool fin, uint8_t opCode, const char *payload, uint64_t payloadLength)
void sendFrameData(uint64_t data) const
std::uniform_int_distribution< uint32_t > distribution
std::size_t getPayloadTotalSent() const
std::size_t payloadTotalSent
void sendMessageStart(uint8_t opCode, const char *message, std::size_t messageLength)
void sendMessageFrame(const char *message, std::size_t messageLength)
std::string hexDump(const char *bytes, uint64_t length, int prefixLength, bool prefixAtFirstLine)