in nlsCppSdk/transport/webSocketTcp.cpp [416:473]
int WebSocketTcp::decodeFrameBodyWebSocketFrame(uint8_t* buffer, size_t length,
WebSocketHeaderType* wsType,
WebSocketFrame* receivedData) {
if (wsType->opCode == WebSocketHeaderType::PONG) {
return Success;
}
if ((wsType->N + wsType->headerSize) > length) {
#ifdef ENABLE_NLS_DEBUG_3
LOG_ERROR("Size: wsType->N(%d) + wsType->headerSize(%u) length(%zu)",
wsType->N, wsType->headerSize, length);
#endif
return -(InvalidWsFrameBody);
}
// LOG_DEBUG("Size: %d %d %d", wsType->N, wsType->headerSize, length);
if (wsType->opCode == WebSocketHeaderType::TEXT_FRAME ||
wsType->opCode == WebSocketHeaderType::BINARY_FRAME ||
wsType->opCode == WebSocketHeaderType::CONTINUATION) {
if (wsType->mask) {
for (size_t i = 0; i != wsType->N; ++i) {
*(buffer + i + wsType->headerSize) ^= wsType->masKingKey[i & 0x3];
}
}
if (receivedData->data == NULL) {
receivedData->type = wsType->opCode;
}
receivedData->data = (buffer + wsType->headerSize);
receivedData->length = (size_t)wsType->N;
} else if (wsType->opCode == WebSocketHeaderType::PING) {
return -(InvalidWsFrameBody);
} else if (wsType->opCode == WebSocketHeaderType::CLOSE) {
StatusCode code;
code.frame[0] = *(buffer + 2);
code.frame[1] = *(buffer + 3);
int recode = ntohs(code.status);
if (receivedData->data == NULL) {
receivedData->type = wsType->opCode;
receivedData->closeCode = recode;
}
receivedData->data = (buffer + wsType->headerSize + 2);
receivedData->length = (size_t)wsType->N;
}
if (wsType->opCode == WebSocketHeaderType::TEXT_FRAME) {
// pass
} else {
// LOG_DEBUG("Decoder Receive Data: %zu ", receivedData->length);
};
LOG_DEBUG(
"WsTcp(%p) Decoder received data opCode:%d dataType:%d dataLength:%d.",
this, wsType->opCode, receivedData->type, receivedData->length);
return Success;
}