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  MaskingKey
 

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 ()
 
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
 
std::size_t readFrameData (char *chunk, std::size_t chunkLen)
 
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
 
uint8_t elengthNumBytes = 0
 
uint8_t elengthNumBytesLeft = 0
 
uint64_t payLoadNumBytes = 0
 
uint64_t payLoadNumBytesLeft = 0
 
uint32_t maskingKey = 0
 
MaskingKey maskingKeyAsArray {}
 
uint8_t maskingKeyNumBytes = 4
 
uint8_t maskingKeyNumBytesLeft = 4
 
uint16_t errorState = 0
 
char elengthChunk [8] {}
 
char maskingKeyChunk [4] {}
 
char payloadChunk [16384] {}
 
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:122

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()

◆ onMessageEnd()

◆ onMessageError()

◆ onMessageStart()

◆ operator=()

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

◆ readELength()

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

Definition at line 166 of file Receiver.cpp.

166 {
167 const std::size_t ret = readFrameData(elengthChunk, elengthNumBytesLeft);
168
169 for (std::size_t i = 0; i < ret; i++) {
170 payLoadNumBytes |= *reinterpret_cast<uint64_t*>(elengthChunk + i) << (elengthNumBytes - elengthNumBytesLeft) * 8;
171
173 }
174
175 if (elengthNumBytesLeft == 0) {
176 switch (elengthNumBytes) {
177 case 2:
178 payLoadNumBytes = payLoadNumBytesLeft = be16toh(static_cast<uint16_t>(payLoadNumBytes));
179 break;
180 case 8:
182 break;
183 }
184
185 if ((payLoadNumBytes & static_cast<uint64_t>(0x01) << 63) != 0) {
187 errorState = 1004;
188 } else if (masked) {
190 } else {
192 }
193 }
194
195 return ret;
196 }
std::size_t readFrameData(char *chunk, std::size_t chunkLen)
Definition Receiver.cpp:279

◆ readFrameData()

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

Definition at line 279 of file Receiver.cpp.

279 {
280 return socketConnection->readFromPeer(chunk, chunkLen);
281 }
virtual std::size_t readFromPeer(char *chunk, std::size_t chunkLen)=0

◆ 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

◆ readMaskingKey()

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

Definition at line 198 of file Receiver.cpp.

198 {
199 const std::size_t ret = readFrameData(maskingKeyChunk, maskingKeyNumBytesLeft);
200
201 for (std::size_t i = 0; i < ret; i++) {
202 maskingKey |= static_cast<uint32_t>(*reinterpret_cast<unsigned char*>(maskingKeyChunk + i))
205 }
206
207 if (maskingKeyNumBytesLeft == 0) {
209
210 if (payLoadNumBytes > 0) {
212 } else {
213 if (fin) {
214 onMessageEnd();
215 }
216 reset();
217 }
218 }
219
220 return ret;
221 }
MaskingKey maskingKeyAsArray
Definition Receiver.h:112

◆ 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

◆ readPayload()

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

Definition at line 223 of file Receiver.cpp.

223 {
225 : static_cast<std::size_t>(payLoadNumBytesLeft);
226
227 const std::size_t ret = readFrameData(payloadChunk, payloadChunkLeft);
228
229 if (ret > 0) {
230 const std::size_t payloadChunkLen = static_cast<std::size_t>(ret);
231
232 if (masked) {
233 for (std::size_t i = 0; i < payloadChunkLen; i++) {
234 *(payloadChunk + i) =
236 }
237 }
238
239 LOG(TRACE) << "WebSocket receive: Frame data\n" << utils::hexDump(payloadChunk, payloadChunkLen, 32, true);
240
241 onMessageData(payloadChunk, payloadChunkLen);
242
243 payLoadNumBytesLeft -= payloadChunkLen;
244 }
245
246 if (payLoadNumBytesLeft == 0) {
247 if (fin) {
248 onMessageEnd();
249 }
250 reset();
251 }
252
253 return ret;
254 }
#define MAX_PAYLOAD_JUNK_LEN
Definition Receiver.h:59
char payloadChunk[16384]
Definition Receiver.h:120
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

◆ 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:198
std::size_t readELength()
Definition Receiver.cpp:166
virtual void onMessageError(uint16_t errnum)=0
std::size_t readPayload()
Definition Receiver.cpp:223
std::size_t readOpcode()
Definition Receiver.cpp:102

◆ reset()

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

Definition at line 256 of file Receiver.cpp.

256 {
258
259 fin = false;
260 continuation = false;
261 masked = false;
262
263 opCode = 0;
264
265 elengthNumBytes = 0;
267
268 payLoadNumBytes = 0;
270
271 maskingKey = 0;
272 maskingKeyAsArray = {.key = 0};
275
276 errorState = 0;
277 }

Member Data Documentation

◆ continuation

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

Definition at line 100 of file Receiver.h.

◆ elengthChunk

char web::websocket::Receiver::elengthChunk[8] {}
private

Definition at line 118 of file Receiver.h.

118{};

◆ elengthNumBytes

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

Definition at line 105 of file Receiver.h.

◆ elengthNumBytesLeft

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

Definition at line 106 of file Receiver.h.

◆ errorState

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

Definition at line 116 of file Receiver.h.

◆ fin

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

Definition at line 99 of file Receiver.h.

◆ masked

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

Definition at line 101 of file Receiver.h.

◆ maskingKey

uint32_t web::websocket::Receiver::maskingKey = 0
private

Definition at line 111 of file Receiver.h.

◆ maskingKeyAsArray

MaskingKey web::websocket::Receiver::maskingKeyAsArray {}
private

Definition at line 112 of file Receiver.h.

112{};

◆ maskingKeyChunk

char web::websocket::Receiver::maskingKeyChunk[4] {}
private

Definition at line 119 of file Receiver.h.

119{};

◆ maskingKeyNumBytes

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

Definition at line 113 of file Receiver.h.

◆ maskingKeyNumBytesLeft

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

Definition at line 114 of file Receiver.h.

◆ opCode

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

Definition at line 103 of file Receiver.h.

◆ parserState

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

◆ payloadChunk

char web::websocket::Receiver::payloadChunk[16384] {}
private

Definition at line 120 of file Receiver.h.

120{};

◆ payLoadNumBytes

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

Definition at line 108 of file Receiver.h.

◆ payLoadNumBytesLeft

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

Definition at line 109 of file Receiver.h.

◆ socketConnection

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

Definition at line 122 of file Receiver.h.


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