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#include "core/socket/stream/SocketConnection.h"
46#ifndef DOXYGEN_SHOULD_SKIP_THIS
48#include "log/Logger.h"
49#include "utils/hexdump.h"
67 std::size_t consumed = 0;
72 switch (parserState) {
107 const uint8_t opCodeByte =
static_cast<uint8_t>(byte);
109 fin = (opCodeByte & 0b10000000) != 0;
110 opCode = opCodeByte & 0b00001111;
120 LOG(ERROR) <<
"WebSocket: Error opcode in continuation frame";
133 const uint8_t lengthByte =
static_cast<uint8_t>(byte);
135 masked = (lengthByte & 0b10000000) != 0;
171 char elengthChunk[2];
176 for (std::size_t i = 0; i < ret; i++) {
177 eLength2
.asBytes[cursor + i] = elengthChunk[i];
189 char elengthChunk[8];
194 for (std::size_t i = 0; i < ret; i++) {
195 eLength8
.asBytes[cursor + i] = elengthChunk[i];
233 char maskingKeyChunk[4]{};
238 for (std::size_t i = 0; i < ret; i++) {
265 const std::size_t payloadChunkLen =
static_cast<std::size_t>(ret);
268 for (std::size_t i = 0; i < payloadChunkLen; i++) {
273 LOG(TRACE) <<
"WebSocket receive: Frame data\n" << utils
::hexDump(payloadChunk
, payloadChunkLen
, 32
, true);
#define MAX_PAYLOAD_JUNK_LEN
virtual std::size_t readFromPeer(char *chunk, std::size_t chunkLen)=0
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()
std::size_t readFrameData(char *chunk, std::size_t chunkLen)
virtual void onMessageData(const char *chunk, uint64_t chunkLen)=0
uint8_t elengthNumBytesLeft
Receiver(core::socket::stream::SocketConnection *socketConnection)
virtual void onMessageError(uint16_t errnum)=0
core::socket::stream::SocketConnection * socketConnection
std::size_t readPayload()
uint8_t maskingKeyNumBytesLeft
std::size_t readELength8()
uint64_t payLoadNumBytesLeft
std::string hexDump(const char *bytes, uint64_t length, int prefixLength, bool prefixAtFirstLine)