* @brief Attempts to parse buffered data as a complete JSON message. */
| 1049 | * @brief Attempts to parse buffered data as a complete JSON message. |
| 1050 | */ |
| 1051 | void API::Server::processBufferedJson(QTcpSocket* socket, |
| 1052 | ConnectionState& state, |
| 1053 | const QByteArray& trimmed) |
| 1054 | { |
| 1055 | Q_ASSERT(socket); |
| 1056 | Q_ASSERT(!trimmed.isEmpty()); |
| 1057 | |
| 1058 | auto& buffer = state.buffer; |
| 1059 | |
| 1060 | if (trimmed.size() > kMaxApiMessageBytes) { |
| 1061 | qWarning() << "[API] Message size limit exceeded:" << state.peerAddress << ":" << state.peerPort |
| 1062 | << "- Message size:" << trimmed.size() << "- Limit:" << kMaxApiMessageBytes; |
| 1063 | |
| 1064 | sendResponseToSocket( |
| 1065 | socket, |
| 1066 | CommandResponse::makeError( |
| 1067 | QString(), ErrorCode::ExecutionError, QStringLiteral("API message exceeds size limit")) |
| 1068 | .toJsonBytes()); |
| 1069 | buffer.clear(); |
| 1070 | return; |
| 1071 | } |
| 1072 | |
| 1073 | if (exceedsJsonDepthLimit(trimmed, kMaxApiJsonDepth)) { |
| 1074 | qWarning() << "[API] JSON depth limit exceeded (buffered):" << state.peerAddress << ":" |
| 1075 | << state.peerPort << "- Max depth:" << kMaxApiJsonDepth; |
| 1076 | |
| 1077 | sendResponseToSocket( |
| 1078 | socket, |
| 1079 | CommandResponse::makeError( |
| 1080 | QString(), ErrorCode::ExecutionError, QStringLiteral("JSON nesting depth exceeds limit")) |
| 1081 | .toJsonBytes()); |
| 1082 | buffer.clear(); |
| 1083 | return; |
| 1084 | } |
| 1085 | |
| 1086 | QString type; |
| 1087 | QJsonObject json; |
| 1088 | try { |
| 1089 | const char firstChar = trimmed.at(0); |
| 1090 | const char lastChar = trimmed.back(); |
| 1091 | const bool complete = |
| 1092 | (firstChar == '{' && lastChar == '}') || (firstChar == '[' && lastChar == ']'); |
| 1093 | |
| 1094 | if (API::parseMessage(trimmed, type, json) || MCP::isMCPMessage(trimmed)) { |
| 1095 | handleJsonMessage(socket, state, trimmed); |
| 1096 | buffer.clear(); |
| 1097 | } else if (complete) { |
| 1098 | sendResponseToSocket( |
| 1099 | socket, |
| 1100 | CommandResponse::makeError( |
| 1101 | QString(), ErrorCode::InvalidJson, QStringLiteral("Failed to parse JSON message")) |
| 1102 | .toJsonBytes()); |
| 1103 | buffer.clear(); |
| 1104 | } |
| 1105 | } catch (...) { |
| 1106 | qWarning() << "[API] JSON parsing exception (buffered):" << state.peerAddress << ":" |
| 1107 | << state.peerPort << "- Buffer size:" << trimmed.size() |
| 1108 | << "- Disconnecting client (malformed or too deep JSON)"; |
nothing calls this directly
no test coverage detected