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"
54#ifndef WSMAXFRAMEPAYLOADLENGTH
55#define WSMAXFRAMEPAYLOADLENGTH 16384
68 send(true, opCode
, message
, messageLength
);
72 send(false, opCode
, message
, messageLength
);
87 void Transmitter::
send(
bool end, uint8_t opCode,
const char* message, std::size_t messageLength) {
88 std::size_t messageOffset = 0;
91 const std::size_t sendFrameLength =
94 const bool fin = (sendFrameLength == messageLength - messageOffset) && end;
98 messageOffset += sendFrameLength;
101 }
while (messageLength - messageOffset > 0);
109 if (payloadLength < 126) {
110 length = payloadLength;
111 }
else if (payloadLength < 0x10000) {
118 header[0] =
static_cast<
char>((fin ? 0b10000000 : 0) | opCode);
120 header[1] =
static_cast<
char>((
masking ? 0b10000000 : 0) | length);
140 if (payloadLength > 0) {
141 LOG(TRACE) <<
"WebSocket send: Frame data\n" << utils
::hexDump(payload
, payloadLength
, 32
, true);
147 for (uint64_t i = 0; i < payloadLength; i++) {
148 *(
const_cast<
char*>(payload) + i) =
static_cast<
char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
155 for (uint64_t i = 0; i < payloadLength; i++) {
156 *(
const_cast<
char*>(payload) + i) =
static_cast<
char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
169 uint16_t sendData = htobe16(data);
176 uint32_t sendData = htobe32(data);
183 uint64_t sendData = htobe64(data);
190 uint64_t frameOffset = 0;
193 const std::size_t sendChunkLen =
194 (frameLength - frameOffset <= SIZE_MAX) ?
static_cast<std::size_t>(frameLength - frameOffset) : SIZE_MAX;
198 frameOffset += sendChunkLen;
199 }
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)