SNode.C
Loading...
Searching...
No Matches
web::websocket::Receiver Class Referenceabstract

#include <Receiver.h>

Inheritance diagram for web::websocket::Receiver:
Collaboration diagram for web::websocket::Receiver:

Classes

union  ELength2
 
union  ELength8
 

Public Member Functions

 Receiver (core::socket::stream::SocketConnection *socketConnection)
 
 Receiver (const Receiver &)=delete
 
Receiveroperator= (const Receiver &)=delete
 
virtual ~Receiver ()
 
std::size_t receive ()
 

Private Types

enum struct  ParserState {
  BEGIN , OPCODE , LENGTH , ELENGTH ,
  MASKINGKEY , PAYLOAD , ERROR
}
 

Private Member Functions

std::size_t readOpcode ()
 
std::size_t readLength ()
 
std::size_t readELength ()
 
std::size_t readMaskingKey ()
 
std::size_t readPayload ()
 
std::size_t readFrameData (char *chunk, std::size_t chunkLen)
 
std::size_t readELength2 ()
 
std::size_t readELength8 ()
 
virtual void onMessageStart (int opCode)=0
 
virtual void onMessageData (const char *chunk, uint64_t chunkLen)=0
 
virtual void onMessageEnd ()=0
 
virtual void onMessageError (uint16_t errnum)=0
 
void reset ()
 

Private Attributes

enum web::websocket::Receiver::ParserState parserState = ParserState::BEGIN
 
bool fin = false
 
bool continuation = false
 
bool masked = false
 
uint8_t opCode = 0
 
char maskingKey [4]
 
union web::websocket::Receiver::ELength8 eLength8
 
union web::websocket::Receiver::ELength2 eLength2
 
uint8_t elengthNumBytes = 0
 
uint8_t elengthNumBytesLeft = 0
 
uint64_t payLoadNumBytes = 0
 
uint64_t payLoadNumBytesLeft = 0
 
uint8_t maskingKeyNumBytes = 4
 
uint8_t maskingKeyNumBytesLeft = 4
 
uint16_t errorState = 0
 
core::socket::stream::SocketConnectionsocketConnection = nullptr
 

Detailed Description

Definition at line 64 of file Receiver.h.

Member Enumeration Documentation

◆ ParserState

Constructor & Destructor Documentation

◆ Receiver() [1/2]

web::websocket::Receiver::Receiver ( core::socket::stream::SocketConnection socketConnection)

Definition at line 58 of file Receiver.cpp.

60 }
core::socket::stream::SocketConnection * socketConnection
Definition Receiver.h:126

References socketConnection.

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

Here is the caller graph for this function:

◆ Receiver() [2/2]

web::websocket::Receiver::Receiver ( const Receiver )
delete

◆ ~Receiver()

web::websocket::Receiver::~Receiver ( )
virtual

Definition at line 62 of file Receiver.cpp.

62 {
63 }

Member Function Documentation

◆ onMessageData()

virtual void web::websocket::Receiver::onMessageData ( const char *  chunk,
uint64_t  chunkLen 
)
privatepure virtual

◆ onMessageEnd()

virtual void web::websocket::Receiver::onMessageEnd ( )
privatepure virtual

◆ onMessageError()

virtual void web::websocket::Receiver::onMessageError ( uint16_t  errnum)
privatepure virtual

◆ onMessageStart()

virtual void web::websocket::Receiver::onMessageStart ( int  opCode)
privatepure virtual

◆ operator=()

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

◆ readELength()

std::size_t web::websocket::Receiver::readELength ( )
private

Definition at line 206 of file Receiver.cpp.

206 {
207 std::size_t ret = 0;
208
209 switch (elengthNumBytes) {
210 case 2:
211 ret = readELength2();
212 break;
213 case 8:
214 ret = readELength8();
215 break;
216 }
217
218 if (elengthNumBytesLeft == 0) {
219 if ((payLoadNumBytes & static_cast<uint64_t>(0x01) << 63) != 0) {
221 errorState = 1004;
222 } else if (masked) {
224 } else {
226 }
227 }
228
229 return ret;
230 }
std::size_t readELength2()
Definition Receiver.cpp:170
std::size_t readELength8()
Definition Receiver.cpp:188

References elengthNumBytes, elengthNumBytesLeft, ERROR, errorState, masked, MASKINGKEY, PAYLOAD, payLoadNumBytes, readELength2(), and readELength8().

Referenced by receive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readELength2()

std::size_t web::websocket::Receiver::readELength2 ( )
private

Definition at line 170 of file Receiver.cpp.

170 {
171 char elengthChunk[2];
172
173 const std::size_t ret = readFrameData(elengthChunk, elengthNumBytesLeft);
174
175 const std::size_t cursor = static_cast<std::size_t>(elengthNumBytes - elengthNumBytesLeft);
176 for (std::size_t i = 0; i < ret; i++) {
177 eLength2.asBytes[cursor + i] = elengthChunk[i];
179 }
180
181 if (elengthNumBytesLeft == 0) {
183 }
184
185 return ret;
186 }
std::size_t readFrameData(char *chunk, std::size_t chunkLen)
Definition Receiver.cpp:166
union web::websocket::Receiver::ELength2 eLength2

References web::websocket::Receiver::ELength2::asBytes, web::websocket::Receiver::ELength2::asValue, elengthNumBytes, elengthNumBytesLeft, payLoadNumBytes, payLoadNumBytesLeft, and readFrameData().

Referenced by readELength().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readELength8()

std::size_t web::websocket::Receiver::readELength8 ( )
private

Definition at line 188 of file Receiver.cpp.

188 {
189 char elengthChunk[8];
190
191 const std::size_t ret = readFrameData(elengthChunk, elengthNumBytesLeft);
192
193 const std::size_t cursor = static_cast<std::size_t>(elengthNumBytes - elengthNumBytesLeft);
194 for (std::size_t i = 0; i < ret; i++) {
195 eLength8.asBytes[cursor + i] = elengthChunk[i];
197 }
198
199 if (elengthNumBytesLeft == 0) {
201 }
202
203 return ret;
204 }
union web::websocket::Receiver::ELength8 eLength8

References web::websocket::Receiver::ELength8::asBytes, web::websocket::Receiver::ELength8::asValue, elengthNumBytes, elengthNumBytesLeft, payLoadNumBytes, payLoadNumBytesLeft, and readFrameData().

Referenced by readELength().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readFrameData()

std::size_t web::websocket::Receiver::readFrameData ( char *  chunk,
std::size_t  chunkLen 
)
private

Definition at line 166 of file Receiver.cpp.

166 {
167 return socketConnection->readFromPeer(chunk, chunkLen);
168 }
virtual std::size_t readFromPeer(char *chunk, std::size_t chunkLen)=0

References core::socket::stream::SocketConnection::readFromPeer(), and socketConnection.

Referenced by readELength2(), readELength8(), readLength(), readMaskingKey(), readOpcode(), and readPayload().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readLength()

std::size_t web::websocket::Receiver::readLength ( )
private

Definition at line 128 of file Receiver.cpp.

128 {
129 char byte = 0;
130 const std::size_t ret = readFrameData(&byte, 1);
131
132 if (ret > 0) {
133 const uint8_t lengthByte = static_cast<uint8_t>(byte);
134
135 masked = (lengthByte & 0b10000000) != 0;
136 payLoadNumBytes = payLoadNumBytesLeft = lengthByte & 0b01111111;
137
138 if (payLoadNumBytes > 125) {
139 switch (payLoadNumBytes) {
140 case 126:
142 break;
143 case 127:
145 break;
146 }
149 } else {
150 if (masked) {
152 } else if (payLoadNumBytes > 0) {
154 } else {
155 if (fin) {
156 onMessageEnd();
157 }
158 reset();
159 }
160 }
161 }
162
163 return ret;
164 }
virtual void onMessageEnd()=0

References ELENGTH, elengthNumBytes, elengthNumBytesLeft, fin, masked, MASKINGKEY, onMessageEnd(), PAYLOAD, payLoadNumBytes, payLoadNumBytesLeft, readFrameData(), and reset().

Referenced by receive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readMaskingKey()

std::size_t web::websocket::Receiver::readMaskingKey ( )
private

Definition at line 232 of file Receiver.cpp.

232 {
233 char maskingKeyChunk[4]{};
234
235 const std::size_t ret = readFrameData(maskingKeyChunk, maskingKeyNumBytesLeft);
236
237 const std::size_t cursor = static_cast<std::size_t>(maskingKeyNumBytes - maskingKeyNumBytesLeft);
238 for (std::size_t i = 0; i < ret; i++) {
239 maskingKey[cursor + i] = maskingKeyChunk[i];
241 }
242
243 if (maskingKeyNumBytesLeft == 0) {
244 if (payLoadNumBytes > 0) {
246 } else {
247 if (fin) {
248 onMessageEnd();
249 }
250 reset();
251 }
252 }
253
254 return ret;
255 }

References fin, maskingKey, maskingKeyNumBytes, maskingKeyNumBytesLeft, onMessageEnd(), PAYLOAD, payLoadNumBytes, readFrameData(), and reset().

Referenced by receive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readOpcode()

std::size_t web::websocket::Receiver::readOpcode ( )
private

Definition at line 102 of file Receiver.cpp.

102 {
103 char byte = 0;
104 const std::size_t ret = readFrameData(&byte, 1);
105
106 if (ret > 0) {
107 const uint8_t opCodeByte = static_cast<uint8_t>(byte);
108
109 fin = (opCodeByte & 0b10000000) != 0;
110 opCode = opCodeByte & 0b00001111;
111
112 if (!continuation) {
115 } else if (opCode == 0) {
117 } else {
119 errorState = 1002;
120 LOG(ERROR) << "WebSocket: Error opcode in continuation frame";
121 }
122 continuation = !fin;
123 }
124
125 return ret;
126 }
virtual void onMessageStart(int opCode)=0

References continuation, ERROR, errorState, fin, LENGTH, onMessageStart(), opCode, and readFrameData().

Referenced by receive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ readPayload()

std::size_t web::websocket::Receiver::readPayload ( )
private

Definition at line 257 of file Receiver.cpp.

257 {
258 char payloadChunk[MAX_PAYLOAD_JUNK_LEN]{};
259
260 const std::size_t payloadChunkLeft = (MAX_PAYLOAD_JUNK_LEN <= payLoadNumBytesLeft) ? static_cast<std::size_t>(MAX_PAYLOAD_JUNK_LEN)
261 : static_cast<std::size_t>(payLoadNumBytesLeft);
262 const std::size_t ret = readFrameData(payloadChunk, payloadChunkLeft);
263
264 if (ret > 0) {
265 const std::size_t payloadChunkLen = static_cast<std::size_t>(ret);
266
267 if (masked) {
268 for (std::size_t i = 0; i < payloadChunkLen; i++) {
269 *(payloadChunk + i) = *(payloadChunk + i) ^ *(maskingKey + (i + payLoadNumBytes - payLoadNumBytesLeft) % 4);
270 }
271 }
272
273 LOG(TRACE) << "WebSocket receive: Frame data\n" << utils::hexDump(payloadChunk, payloadChunkLen, 32, true);
274
275 onMessageData(payloadChunk, payloadChunkLen);
276
277 payLoadNumBytesLeft -= payloadChunkLen;
278 }
279
280 if (payLoadNumBytesLeft == 0) {
281 if (fin) {
282 onMessageEnd();
283 }
284 reset();
285 }
286
287 return ret;
288 }
#define MAX_PAYLOAD_JUNK_LEN
Definition Receiver.h:59
virtual void onMessageData(const char *chunk, uint64_t chunkLen)=0
std::string hexDump(const std::vector< char > &bytes, int prefixLength, bool prefixAtFirstLine)
Definition hexdump.cpp:58

References fin, utils::hexDump(), masked, maskingKey, onMessageData(), onMessageEnd(), payLoadNumBytes, payLoadNumBytesLeft, readFrameData(), and reset().

Referenced by receive().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ receive()

std::size_t web::websocket::Receiver::receive ( )

Definition at line 65 of file Receiver.cpp.

65 {
66 std::size_t ret = 0;
67 std::size_t consumed = 0;
68
69 // dumpFrame(chunk, chunkLen);
70
71 do {
72 switch (parserState) {
75 [[fallthrough]];
77 ret = readOpcode();
78 break;
80 ret = readLength();
81 break;
83 ret = readELength();
84 break;
86 ret = readMaskingKey();
87 break;
89 ret = readPayload();
90 break;
93 reset();
94 break;
95 }
96 consumed += ret;
98
99 return consumed;
100 }
std::size_t readLength()
Definition Receiver.cpp:128
std::size_t readMaskingKey()
Definition Receiver.cpp:232
std::size_t readELength()
Definition Receiver.cpp:206
virtual void onMessageError(uint16_t errnum)=0
std::size_t readPayload()
Definition Receiver.cpp:257
std::size_t readOpcode()
Definition Receiver.cpp:102

References BEGIN, ELENGTH, ERROR, errorState, LENGTH, MASKINGKEY, onMessageError(), OPCODE, PAYLOAD, readELength(), readLength(), readMaskingKey(), readOpcode(), readPayload(), and reset().

Referenced by web::websocket::SocketContextUpgrade< SubProtocolT, RequestT, ResponseT >::onReceivedFromPeer().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reset()

void web::websocket::Receiver::reset ( )
private

Definition at line 290 of file Receiver.cpp.

290 {
292
293 fin = false;
294 continuation = false;
295 masked = false;
296
297 opCode = 0;
298
299 elengthNumBytes = 0;
301
302 payLoadNumBytes = 0;
304
307
308 errorState = 0;
309 }

References BEGIN, continuation, elengthNumBytes, elengthNumBytesLeft, errorState, fin, masked, maskingKeyNumBytes, maskingKeyNumBytesLeft, opCode, payLoadNumBytes, and payLoadNumBytesLeft.

Referenced by readLength(), readMaskingKey(), readPayload(), and receive().

Here is the caller graph for this function:

Member Data Documentation

◆ continuation

bool web::websocket::Receiver::continuation = false
private

Definition at line 98 of file Receiver.h.

Referenced by readOpcode(), and reset().

◆ eLength2

union web::websocket::Receiver::ELength2 web::websocket::Receiver::eLength2
private

◆ eLength8

union web::websocket::Receiver::ELength8 web::websocket::Receiver::eLength8
private

◆ elengthNumBytes

uint8_t web::websocket::Receiver::elengthNumBytes = 0
private

Definition at line 115 of file Receiver.h.

Referenced by readELength(), readELength2(), readELength8(), readLength(), and reset().

◆ elengthNumBytesLeft

uint8_t web::websocket::Receiver::elengthNumBytesLeft = 0
private

Definition at line 116 of file Receiver.h.

Referenced by readELength(), readELength2(), readELength8(), readLength(), and reset().

◆ errorState

uint16_t web::websocket::Receiver::errorState = 0
private

Definition at line 124 of file Receiver.h.

Referenced by readELength(), readOpcode(), receive(), and reset().

◆ fin

bool web::websocket::Receiver::fin = false
private

Definition at line 97 of file Receiver.h.

Referenced by readLength(), readMaskingKey(), readOpcode(), readPayload(), and reset().

◆ masked

bool web::websocket::Receiver::masked = false
private

Definition at line 99 of file Receiver.h.

Referenced by readELength(), readLength(), readPayload(), and reset().

◆ maskingKey

char web::websocket::Receiver::maskingKey[4]
private

Definition at line 103 of file Receiver.h.

Referenced by readMaskingKey(), and readPayload().

◆ maskingKeyNumBytes

uint8_t web::websocket::Receiver::maskingKeyNumBytes = 4
private

Definition at line 121 of file Receiver.h.

Referenced by readMaskingKey(), and reset().

◆ maskingKeyNumBytesLeft

uint8_t web::websocket::Receiver::maskingKeyNumBytesLeft = 4
private

Definition at line 122 of file Receiver.h.

Referenced by readMaskingKey(), and reset().

◆ opCode

uint8_t web::websocket::Receiver::opCode = 0
private

Definition at line 101 of file Receiver.h.

Referenced by readOpcode(), and reset().

◆ parserState

enum web::websocket::Receiver::ParserState web::websocket::Receiver::parserState = ParserState::BEGIN
private

◆ payLoadNumBytes

uint64_t web::websocket::Receiver::payLoadNumBytes = 0
private

◆ payLoadNumBytesLeft

uint64_t web::websocket::Receiver::payLoadNumBytesLeft = 0
private

Definition at line 119 of file Receiver.h.

Referenced by readELength2(), readELength8(), readLength(), readPayload(), and reset().

◆ socketConnection

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

Definition at line 126 of file Receiver.h.

Referenced by readFrameData(), and Receiver().


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