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#include "core/socket/stream/SocketConnection.h"
46#ifndef DOXYGEN_SHOULD_SKIP_THIS
48#include "log/Logger.h"
49#include "utils/hexdump.h"
69 send(true, opCode
, message
, messageLength
);
73 send(false, opCode
, message
, messageLength
);
84 void Transmitter::
send(
bool end, uint8_t opCode,
const char* message, std::size_t messageLength) {
85 std::size_t messageOffset = 0;
88 const std::size_t sendFrameLength =
91 const bool fin = (sendFrameLength == messageLength - messageOffset) && end;
95 messageOffset += sendFrameLength;
98 }
while (messageLength - messageOffset > 0);
104 if (payloadLength < 126) {
105 length = payloadLength;
106 }
else if (payloadLength < 0x10000) {
113 header[0] =
static_cast<
char>((fin ? 0b10000000 : 0) | opCode);
115 header[1] =
static_cast<
char>((
masking ? 0b10000000 : 0) | length);
135 if (payloadLength > 0) {
136 LOG(TRACE) <<
"WebSocket send: Frame data\n" << utils
::hexDump(payload
, payloadLength
, 32
, true);
142 for (uint64_t i = 0; i < payloadLength; i++) {
143 *(
const_cast<
char*>(payload) + i) =
static_cast<
char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
150 for (uint64_t i = 0; i < payloadLength; i++) {
151 *(
const_cast<
char*>(payload) + i) =
static_cast<
char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
164 uint16_t sendData = htobe16(data);
171 uint32_t sendData = htobe32(data);
178 uint64_t sendData = htobe64(data);
185 uint64_t frameOffset = 0;
188 std::size_t sendChunkLen =
189 (frameLength - frameOffset <= SIZE_MAX) ?
static_cast<std::size_t>(frameLength - frameOffset) : SIZE_MAX;
193 frameOffset += sendChunkLen;
194 }
while (frameLength - frameOffset > 0);
constexpr int WSMAXFRAMEPAYLOADLENGTH
virtual void sendToPeer(const char *chunk, std::size_t chunkLen)=0
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
void sendFrameData(uint16_t data) const
void sendMessage(uint8_t opCode, const char *message, std::size_t messageLength)
void sendFrameData(uint32_t data) const
Transmitter(core::socket::stream::SocketConnection *socketConnection, bool masking)
core::socket::stream::SocketConnection * socketConnection
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
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)