RequestHandler: Add RequestBatch logic

This commit is contained in:
tt2468 2021-05-03 18:44:13 -07:00
parent 2aba810ce1
commit 160ef4d771
3 changed files with 61 additions and 7 deletions

View File

@ -91,12 +91,8 @@ WebSocketProtocol::ProcessResult WebSocketProtocol::ProcessMessage(SessionPtr se
return ret;
}
if (!incomingMessage.contains("requestType")) {
if (!session->IgnoreInvalidMessages()) {
ret.closeCode = WebSocketServer::WebSocketCloseCode::RequestMissingRequiredField;
ret.closeReason = "Your request is missing a `requestType`.";
}
return ret;
if (!incomingMessage["requestType"].is_string()) {
incomingMessage["requestType"] = "";
}
RequestHandler requestHandler;
@ -118,7 +114,60 @@ WebSocketProtocol::ProcessResult WebSocketProtocol::ProcessMessage(SessionPtr se
return ret;
} else if (messageType == "RequestBatch") {
;
// RequestID checking has to be done here where we are able to close the connection.
if (!incomingMessage.contains("requestId")) {
if (!session->IgnoreInvalidMessages()) {
ret.closeCode = WebSocketServer::WebSocketCloseCode::RequestMissingRequiredField;
ret.closeReason = "Your request batch is missing a `requestId`.";
}
return ret;
}
if (!incomingMessage["requests"].is_array()) {
if (!session->IgnoreInvalidMessages()) {
ret.closeCode = WebSocketServer::WebSocketCloseCode::RequestMissingRequiredField;
ret.closeReason = "Your request batch is missing a `requests` or it is not an array.";
}
return ret;
}
auto requests = incomingMessage["requests"].get<std::vector<json>>();
json results = json::array();
RequestHandler requestHandler;
for (auto requestJson : requests) {
if (!requestJson["requestType"].is_string())
requestJson["requestType"] = "";
Request request(session->RpcVersion(), session->IgnoreNonFatalRequestChecks(), requestJson["requestType"], requestJson["requestData"]);
RequestResult requestResult = requestHandler.ProcessRequest(request);
json result;
result["requestType"] = requestJson["requestType"];
if (requestJson.contains("requestId"))
result["requestId"] = requestJson["requestId"];
result["requestStatus"] = {
{"result", requestResult.StatusCode == RequestStatus::Success},
{"code", requestResult.StatusCode}
};
if (!requestResult.Comment.empty())
result["requestStatus"]["comment"] = requestResult.Comment;
if (requestResult.ResponseData.is_object())
result["responseData"] = requestResult.ResponseData;
results.push_back(result);
}
ret.result["messageType"] = "RequestBatchResponse";
ret.result["requestId"] = incomingMessage["requestId"];
ret.result["results"] = results;
return ret;
} else if (messageType == "Identify") {
std::unique_lock<std::mutex> sessionLock(session->OperationMutex);
if (session->IsIdentified()) {

View File

@ -14,6 +14,9 @@ RequestResult RequestHandler::ProcessRequest(const Request& request)
if (!request.RequestData.is_null() && !request.RequestData.is_object())
return RequestResult::Error(RequestStatus::InvalidRequestParameterDataType, "Your request data is not an object.");
if (request.RequestType.empty())
return RequestResult::Error(RequestStatus::MissingRequestType, "Your request is missing a `requestType`");
RequestMethodHandler handler;
try {
handler = _handlerMap.at(request.RequestType);

View File

@ -9,6 +9,8 @@ namespace RequestStatus {
Success = 100,
// The `requestType` field is missing from the request data
MissingRequestType = 203,
// The request type is invalid (does not exist)
UnknownRequestType = 204,
// Generic error code (comment is expected to be provided)