SNode.C
Loading...
Searching...
No Matches
web::websocket::Transmitter Class Reference

#include <Transmitter.h>

Inheritance diagram for web::websocket::Transmitter:
Collaboration diagram for web::websocket::Transmitter:

Public Member Functions

 Transmitter ()=delete
 
 Transmitter (const Transmitter &)=delete
 
Transmitteroperator= (const Transmitter &)=delete
 
virtual ~Transmitter ()
 

Protected Member Functions

 Transmitter (core::socket::stream::SocketConnection *socketConnection, bool masking)
 
void sendMessage (uint8_t opCode, const char *message, std::size_t messageLength)
 
void sendMessageStart (uint8_t opCode, const char *message, std::size_t messageLength)
 
void sendMessageFrame (const char *message, std::size_t messageLength)
 
void sendMessageEnd (const char *message, std::size_t messageLength)
 

Protected Attributes

bool closeSent = false
 

Private Member Functions

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 (uint8_t data) const
 
void sendFrameData (uint16_t data) const
 
void sendFrameData (uint32_t data) const
 
void sendFrameData (uint64_t data) const
 
void sendFrameData (const char *frame, uint64_t frameLength) const
 

Private Attributes

std::random_device randomDevice
 
std::uniform_int_distribution< uint32_t > distribution {0, UINT32_MAX}
 
core::socket::stream::SocketConnectionsocketConnection = nullptr
 
bool masking = false
 

Detailed Description

Definition at line 61 of file Transmitter.h.

Constructor & Destructor Documentation

◆ Transmitter() [1/3]

web::websocket::Transmitter::Transmitter ( )
delete

◆ Transmitter() [2/3]

web::websocket::Transmitter::Transmitter ( const Transmitter & )
delete

◆ ~Transmitter()

web::websocket::Transmitter::~Transmitter ( )
virtual

Definition at line 65 of file Transmitter.cpp.

65 {
66 }

◆ Transmitter() [3/3]

web::websocket::Transmitter::Transmitter ( core::socket::stream::SocketConnection * socketConnection,
bool masking )
protected

Definition at line 60 of file Transmitter.cpp.

62 , masking(masking) {
63 }
core::socket::stream::SocketConnection * socketConnection
Definition Transmitter.h:93

Referenced by web::websocket::SubProtocolContext::SubProtocolContext().

Here is the caller graph for this function:

Member Function Documentation

◆ operator=()

Transmitter & web::websocket::Transmitter::operator= ( const Transmitter & )
delete

◆ send()

void web::websocket::Transmitter::send ( bool end,
uint8_t opCode,
const char * message,
std::size_t messageLength )
private

Definition at line 84 of file Transmitter.cpp.

84 {
85 std::size_t messageOffset = 0;
86
87 do {
88 const std::size_t sendFrameLength =
89 (messageLength - messageOffset <= WSMAXFRAMEPAYLOADLENGTH) ? messageLength - messageOffset : WSMAXFRAMEPAYLOADLENGTH;
90
91 const bool fin = (sendFrameLength == messageLength - messageOffset) && end;
92
93 sendFrame(fin, opCode, message + messageOffset, sendFrameLength);
94
95 messageOffset += sendFrameLength;
96
97 opCode = 0; // continuation
98 } while (messageLength - messageOffset > 0);
99 }
constexpr int WSMAXFRAMEPAYLOADLENGTH
void sendFrame(bool fin, uint8_t opCode, const char *payload, uint64_t payloadLength)

◆ sendFrame()

void web::websocket::Transmitter::sendFrame ( bool fin,
uint8_t opCode,
const char * payload,
uint64_t payloadLength )
private

Definition at line 101 of file Transmitter.cpp.

101 {
102 uint64_t length = 0;
103
104 if (payloadLength < 126) {
105 length = payloadLength;
106 } else if (payloadLength < 0x10000) {
107 length = 126;
108 } else {
109 length = 127;
110 }
111
112 char header[2];
113 header[0] = static_cast<char>((fin ? 0b10000000 : 0) | opCode);
114
115 header[1] = static_cast<char>((masking ? 0b10000000 : 0) | length);
116
117 sendFrameData(header, 2);
118
119 switch (length) {
120 case 126:
121 sendFrameData(static_cast<uint16_t>(payloadLength));
122 break;
123 case 127:
124 sendFrameData(payloadLength);
125 break;
126 }
127
128 union MaskingKey {
129 uint32_t keyAsValue;
130 char keyAsBytes[4];
131 };
132
133 MaskingKey maskingKeyAsArray = {.keyAsValue = distribution(randomDevice)};
134
135 if (payloadLength > 0) {
136 LOG(TRACE) << "WebSocket send: Frame data\n" << utils::hexDump(payload, payloadLength, 32, true);
137 }
138
139 if (masking) {
140 sendFrameData(htobe32(maskingKeyAsArray.keyAsValue));
141
142 for (uint64_t i = 0; i < payloadLength; i++) {
143 *(const_cast<char*>(payload) + i) = static_cast<char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
144 }
145 }
146
147 sendFrameData(payload, payloadLength);
148
149 if (masking) {
150 for (uint64_t i = 0; i < payloadLength; i++) {
151 *(const_cast<char*>(payload) + i) = static_cast<char>(*(payload + i) ^ *(maskingKeyAsArray.keyAsBytes + i % 4));
152 }
153 }
154 }
std::random_device randomDevice
Definition Transmitter.h:90
void sendFrameData(uint8_t data) const
std::uniform_int_distribution< uint32_t > distribution
Definition Transmitter.h:91
std::string hexDump(const std::vector< char > &bytes, int prefixLength, bool prefixAtFirstLine)
Definition hexdump.cpp:58

◆ sendFrameData() [1/5]

void web::websocket::Transmitter::sendFrameData ( const char * frame,
uint64_t frameLength ) const
private

Definition at line 183 of file Transmitter.cpp.

183 {
184 if (!closeSent) {
185 uint64_t frameOffset = 0;
186
187 do {
188 std::size_t sendChunkLen =
189 (frameLength - frameOffset <= SIZE_MAX) ? static_cast<std::size_t>(frameLength - frameOffset) : SIZE_MAX;
190
191 socketConnection->sendToPeer(frame + frameOffset, sendChunkLen);
192
193 frameOffset += sendChunkLen;
194 } while (frameLength - frameOffset > 0);
195 }
196 }
virtual void sendToPeer(const char *chunk, std::size_t chunkLen)=0

◆ sendFrameData() [2/5]

void web::websocket::Transmitter::sendFrameData ( uint16_t data) const
private

Definition at line 162 of file Transmitter.cpp.

162 {
163 if (!closeSent) {
164 uint16_t sendData = htobe16(data);
165 sendFrameData(reinterpret_cast<char*>(&sendData), sizeof(uint16_t));
166 }
167 }

◆ sendFrameData() [3/5]

void web::websocket::Transmitter::sendFrameData ( uint32_t data) const
private

Definition at line 169 of file Transmitter.cpp.

169 {
170 if (!closeSent) {
171 uint32_t sendData = htobe32(data);
172 sendFrameData(reinterpret_cast<char*>(&sendData), sizeof(uint32_t));
173 }
174 }

◆ sendFrameData() [4/5]

void web::websocket::Transmitter::sendFrameData ( uint64_t data) const
private

Definition at line 176 of file Transmitter.cpp.

176 {
177 if (!closeSent) {
178 uint64_t sendData = htobe64(data);
179 sendFrameData(reinterpret_cast<char*>(&sendData), sizeof(uint64_t));
180 }
181 }

◆ sendFrameData() [5/5]

void web::websocket::Transmitter::sendFrameData ( uint8_t data) const
private

Definition at line 156 of file Transmitter.cpp.

156 {
157 if (!closeSent) {
158 sendFrameData(reinterpret_cast<char*>(&data), sizeof(uint8_t));
159 }
160 }

◆ sendMessage()

void web::websocket::Transmitter::sendMessage ( uint8_t opCode,
const char * message,
std::size_t messageLength )
protected

Definition at line 68 of file Transmitter.cpp.

68 {
69 send(true, opCode, message, messageLength);
70 }
void send(bool end, uint8_t opCode, const char *message, std::size_t messageLength)

◆ sendMessageEnd()

void web::websocket::Transmitter::sendMessageEnd ( const char * message,
std::size_t messageLength )
protected

Definition at line 80 of file Transmitter.cpp.

80 {
81 send(true, 0, message, messageLength);
82 }

◆ sendMessageFrame()

void web::websocket::Transmitter::sendMessageFrame ( const char * message,
std::size_t messageLength )
protected

Definition at line 76 of file Transmitter.cpp.

76 {
77 send(false, 0, message, messageLength);
78 }

◆ sendMessageStart()

void web::websocket::Transmitter::sendMessageStart ( uint8_t opCode,
const char * message,
std::size_t messageLength )
protected

Definition at line 72 of file Transmitter.cpp.

72 {
73 send(false, opCode, message, messageLength);
74 }

Member Data Documentation

◆ closeSent

bool web::websocket::Transmitter::closeSent = false
protected

Definition at line 98 of file Transmitter.h.

◆ distribution

std::uniform_int_distribution<uint32_t> web::websocket::Transmitter::distribution {0, UINT32_MAX}
private

Definition at line 91 of file Transmitter.h.

91{0, UINT32_MAX};

◆ masking

bool web::websocket::Transmitter::masking = false
private

Definition at line 95 of file Transmitter.h.

◆ randomDevice

std::random_device web::websocket::Transmitter::randomDevice
private

Definition at line 90 of file Transmitter.h.

◆ socketConnection

core::socket::stream::SocketConnection* web::websocket::Transmitter::socketConnection = nullptr
private

Definition at line 93 of file Transmitter.h.


The documentation for this class was generated from the following files: