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/Receiver.h"
44#ifndef DOXYGEN_SHOULD_SKIP_THIS
46#include "log/Logger.h"
47#include "utils/hexdump.h"
54#ifndef MAX_PAYLOAD_CHUNK_LEN
55#define MAX_PAYLOAD_CHUNK_LEN 16384
69 std::size_t consumed = 0;
74 switch (parserState) {
117 const uint8_t opCodeByte =
static_cast<uint8_t>(byte);
119 fin = (opCodeByte & 0b10000000) != 0;
120 opCode = opCodeByte & 0b00001111;
130 LOG(ERROR) <<
"WebSocket: Error opcode in continuation frame";
143 const uint8_t lengthByte =
static_cast<uint8_t>(byte);
145 masked = (lengthByte & 0b10000000) != 0;
181 char elengthChunk[2]{};
186 for (std::size_t i = 0; i < ret; i++) {
187 eLength2
.asBytes[cursor + i] = elengthChunk[i];
199 char elengthChunk[8]{};
204 for (std::size_t i = 0; i < ret; i++) {
205 eLength8
.asBytes[cursor + i] = elengthChunk[i];
243 char maskingKeyChunk[4]{};
248 for (std::size_t i = 0; i < ret; i++) {
276 const std::size_t payloadChunkLen =
static_cast<std::size_t>(ret);
279 for (std::size_t i = 0; i < payloadChunkLen; i++) {
284 LOG(TRACE) <<
"WebSocket receive: Frame data\n" << utils
::hexDump(payloadChunk
, payloadChunkLen
, 32
, true);
#define MAX_PAYLOAD_CHUNK_LEN
std::size_t readELength2()
virtual void onMessageEnd()=0
virtual void onMessageStart(int opCode)=0
uint8_t maskingKeyNumBytes
std::size_t readMaskingKey()
std::size_t readELength()
Receiver(bool maskingExpected)
std::size_t readFrameData(char *chunk, std::size_t chunkLen)
virtual void onMessageData(const char *chunk, uint64_t chunkLen)=0
virtual std::size_t readFrameChunk(char *chunk, std::size_t chunkLen) const =0
uint8_t elengthNumBytesLeft
virtual void onMessageError(uint16_t errnum)=0
std::size_t readPayload()
uint8_t maskingKeyNumBytesLeft
uint64_t payloadNumBytesLeft
std::size_t readELength8()
std::size_t payloadTotalRead
std::size_t getPayloadTotalRead() const
std::string hexDump(const char *bytes, uint64_t length, int prefixLength, bool prefixAtFirstLine)