mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
RequestHandler: Add RequestBatch logic
This commit is contained in:
parent
2aba810ce1
commit
160ef4d771
@ -91,12 +91,8 @@ WebSocketProtocol::ProcessResult WebSocketProtocol::ProcessMessage(SessionPtr se
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!incomingMessage.contains("requestType")) {
|
if (!incomingMessage["requestType"].is_string()) {
|
||||||
if (!session->IgnoreInvalidMessages()) {
|
incomingMessage["requestType"] = "";
|
||||||
ret.closeCode = WebSocketServer::WebSocketCloseCode::RequestMissingRequiredField;
|
|
||||||
ret.closeReason = "Your request is missing a `requestType`.";
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RequestHandler requestHandler;
|
RequestHandler requestHandler;
|
||||||
@ -118,7 +114,60 @@ WebSocketProtocol::ProcessResult WebSocketProtocol::ProcessMessage(SessionPtr se
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
} else if (messageType == "RequestBatch") {
|
} 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") {
|
} else if (messageType == "Identify") {
|
||||||
std::unique_lock<std::mutex> sessionLock(session->OperationMutex);
|
std::unique_lock<std::mutex> sessionLock(session->OperationMutex);
|
||||||
if (session->IsIdentified()) {
|
if (session->IsIdentified()) {
|
||||||
|
@ -14,6 +14,9 @@ RequestResult RequestHandler::ProcessRequest(const Request& request)
|
|||||||
if (!request.RequestData.is_null() && !request.RequestData.is_object())
|
if (!request.RequestData.is_null() && !request.RequestData.is_object())
|
||||||
return RequestResult::Error(RequestStatus::InvalidRequestParameterDataType, "Your request data is not an 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;
|
RequestMethodHandler handler;
|
||||||
try {
|
try {
|
||||||
handler = _handlerMap.at(request.RequestType);
|
handler = _handlerMap.at(request.RequestType);
|
||||||
|
@ -9,6 +9,8 @@ namespace RequestStatus {
|
|||||||
|
|
||||||
Success = 100,
|
Success = 100,
|
||||||
|
|
||||||
|
// The `requestType` field is missing from the request data
|
||||||
|
MissingRequestType = 203,
|
||||||
// The request type is invalid (does not exist)
|
// The request type is invalid (does not exist)
|
||||||
UnknownRequestType = 204,
|
UnknownRequestType = 204,
|
||||||
// Generic error code (comment is expected to be provided)
|
// Generic error code (comment is expected to be provided)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user