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 42 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 36 of file Receiver.cpp.

38 }
core::socket::stream::SocketConnection * socketConnection
Definition Receiver.h:100

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 40 of file Receiver.cpp.

40 {
41 }

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 144 of file Receiver.cpp.

144 {
145 const std::size_t ret = readFrameData(elengthChunk, elengthNumBytesLeft);
146
147 for (std::size_t i = 0; i < ret; i++) {
148 payLoadNumBytes |= *reinterpret_cast<uint64_t*>(elengthChunk + i) << (elengthNumBytes - elengthNumBytesLeft) * 8;
149
151 }
152
153 if (elengthNumBytesLeft == 0) {
154 switch (elengthNumBytes) {
155 case 2:
156 payLoadNumBytes = payLoadNumBytesLeft = be16toh(static_cast<uint16_t>(payLoadNumBytes));
157 break;
158 case 8:
160 break;
161 }
162
163 if ((payLoadNumBytes & static_cast<uint64_t>(0x01) << 63) != 0) {
165 errorState = 1004;
166 } else if (masked) {
168 } else {
170 }
171 }
172
173 return ret;
174 }
std::size_t readFrameData(char *chunk, std::size_t chunkLen)
Definition Receiver.cpp:257
uint64_t payLoadNumBytesLeft
Definition Receiver.h:87

◆ readFrameData()

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

Definition at line 257 of file Receiver.cpp.

257 {
258 return socketConnection->readFromPeer(chunk, chunkLen);
259 }
virtual std::size_t readFromPeer(char *chunk, std::size_t chunkLen)=0

◆ readLength()

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

Definition at line 106 of file Receiver.cpp.

106 {
107 char byte = 0;
108 const std::size_t ret = readFrameData(&byte, 1);
109
110 if (ret > 0) {
111 const uint8_t lengthByte = static_cast<uint8_t>(byte);
112
113 masked = (lengthByte & 0b10000000) != 0;
114 payLoadNumBytes = payLoadNumBytesLeft = lengthByte & 0b01111111;
115
116 if (payLoadNumBytes > 125) {
117 switch (payLoadNumBytes) {
118 case 126:
120 break;
121 case 127:
123 break;
124 }
127 } else {
128 if (masked) {
130 } else if (payLoadNumBytes > 0) {
132 } else {
133 if (fin) {
134 onMessageEnd();
135 }
136 reset();
137 }
138 }
139 }
140
141 return ret;
142 }
virtual void onMessageEnd()=0

◆ readMaskingKey()

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

Definition at line 176 of file Receiver.cpp.

176 {
177 const std::size_t ret = readFrameData(maskingKeyChunk, maskingKeyNumBytesLeft);
178
179 for (std::size_t i = 0; i < ret; i++) {
180 maskingKey |= static_cast<uint32_t>(*reinterpret_cast<unsigned char*>(maskingKeyChunk + i))
183 }
184
185 if (maskingKeyNumBytesLeft == 0) {
187
188 if (payLoadNumBytes > 0) {
190 } else {
191 if (fin) {
192 onMessageEnd();
193 }
194 reset();
195 }
196 }
197
198 return ret;
199 }
MaskingKey maskingKeyAsArray
Definition Receiver.h:90
uint8_t maskingKeyNumBytesLeft
Definition Receiver.h:92

◆ readOpcode()

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

Definition at line 80 of file Receiver.cpp.

80 {
81 char byte = 0;
82 const std::size_t ret = readFrameData(&byte, 1);
83
84 if (ret > 0) {
85 const uint8_t opCodeByte = static_cast<uint8_t>(byte);
86
87 fin = (opCodeByte & 0b10000000) != 0;
88 opCode = opCodeByte & 0b00001111;
89
90 if (!continuation) {
93 } else if (opCode == 0) {
95 } else {
97 errorState = 1002;
98 LOG(ERROR) << "WebSocket: Error opcode in continuation frame";
99 }
100 continuation = !fin;
101 }
102
103 return ret;
104 }
virtual void onMessageStart(int opCode)=0

◆ readPayload()

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

Definition at line 201 of file Receiver.cpp.

201 {
203 : static_cast<std::size_t>(payLoadNumBytesLeft);
204
205 const std::size_t ret = readFrameData(payloadChunk, payloadChunkLeft);
206
207 if (ret > 0) {
208 const std::size_t payloadChunkLen = static_cast<std::size_t>(ret);
209
210 if (masked) {
211 for (std::size_t i = 0; i < payloadChunkLen; i++) {
212 *(payloadChunk + i) =
214 }
215 }
216
217 LOG(TRACE) << "WebSocket receive: Frame data\n" << utils::hexDump(payloadChunk, payloadChunkLen, 32, true);
218
219 onMessageData(payloadChunk, payloadChunkLen);
220
221 payLoadNumBytesLeft -= payloadChunkLen;
222 }
223
224 if (payLoadNumBytesLeft == 0) {
225 if (fin) {
226 onMessageEnd();
227 }
228 reset();
229 }
230
231 return ret;
232 }
#define MAX_PAYLOAD_JUNK_LEN
Definition Receiver.h:37
char payloadChunk[16384]
Definition Receiver.h:98
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:36

◆ receive()

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

Definition at line 43 of file Receiver.cpp.

43 {
44 std::size_t ret = 0;
45 std::size_t consumed = 0;
46
47 // dumpFrame(chunk, chunkLen);
48
49 do {
50 switch (parserState) {
53 [[fallthrough]];
55 ret = readOpcode();
56 break;
58 ret = readLength();
59 break;
61 ret = readELength();
62 break;
64 ret = readMaskingKey();
65 break;
67 ret = readPayload();
68 break;
71 reset();
72 break;
73 }
74 consumed += ret;
76
77 return consumed;
78 }
std::size_t readLength()
Definition Receiver.cpp:106
std::size_t readMaskingKey()
Definition Receiver.cpp:176
std::size_t readELength()
Definition Receiver.cpp:144
virtual void onMessageError(uint16_t errnum)=0
std::size_t readPayload()
Definition Receiver.cpp:201
std::size_t readOpcode()
Definition Receiver.cpp:80

◆ reset()

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

Definition at line 234 of file Receiver.cpp.

234 {
236
237 fin = false;
238 continuation = false;
239 masked = false;
240
241 opCode = 0;
242
243 elengthNumBytes = 0;
245
246 payLoadNumBytes = 0;
248
249 maskingKey = 0;
250 maskingKeyAsArray = {.key = 0};
253
254 errorState = 0;
255 }

Member Data Documentation

◆ continuation

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

Definition at line 78 of file Receiver.h.

◆ elengthChunk

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

Definition at line 96 of file Receiver.h.

96{};

◆ elengthNumBytes

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

Definition at line 83 of file Receiver.h.

◆ elengthNumBytesLeft

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

Definition at line 84 of file Receiver.h.

◆ errorState

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

Definition at line 94 of file Receiver.h.

◆ fin

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

Definition at line 77 of file Receiver.h.

◆ masked

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

Definition at line 79 of file Receiver.h.

◆ maskingKey

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

Definition at line 89 of file Receiver.h.

◆ maskingKeyAsArray

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

Definition at line 90 of file Receiver.h.

90{};

◆ maskingKeyChunk

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

Definition at line 97 of file Receiver.h.

97{};

◆ maskingKeyNumBytes

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

Definition at line 91 of file Receiver.h.

◆ maskingKeyNumBytesLeft

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

Definition at line 92 of file Receiver.h.

◆ opCode

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

Definition at line 81 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 98 of file Receiver.h.

98{};

◆ payLoadNumBytes

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

Definition at line 86 of file Receiver.h.

◆ payLoadNumBytesLeft

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

Definition at line 87 of file Receiver.h.

◆ socketConnection

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

Definition at line 100 of file Receiver.h.


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