int WebSocketTcp::decodeFrameBodyWebSocketFrame()

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;
}