WSRequestHandler: fix main

This commit is contained in:
Stéphane Lepin 2019-11-15 19:12:42 +01:00
parent ee6e241144
commit ffa6371e3d
2 changed files with 143 additions and 230 deletions

View File

@ -24,7 +24,7 @@
#include "WSRequestHandler.h" #include "WSRequestHandler.h"
QHash<QString, HandlerResponse(*)(WSRequestHandler*)> WSRequestHandler::messageMap{ QHash<QString, RpcResponse(*)(const RpcRequest&)> WSRequestHandler::messageMap {
{ "GetVersion", WSRequestHandler::HandleGetVersion }, { "GetVersion", WSRequestHandler::HandleGetVersion },
{ "GetAuthRequired", WSRequestHandler::HandleGetAuthRequired }, { "GetAuthRequired", WSRequestHandler::HandleGetAuthRequired },
{ "Authenticate", WSRequestHandler::HandleAuthenticate }, { "Authenticate", WSRequestHandler::HandleAuthenticate },
@ -148,141 +148,80 @@ QSet<QString> WSRequestHandler::authNotRequired {
}; };
WSRequestHandler::WSRequestHandler(ConnectionProperties& connProperties) : WSRequestHandler::WSRequestHandler(ConnectionProperties& connProperties) :
_messageId(0),
_requestType(""),
data(nullptr),
_connProperties(connProperties) _connProperties(connProperties)
{ {
} }
std::string WSRequestHandler::processIncomingMessage(std::string& textMessage) { // std::string WSRequestHandler::processIncomingMessage(std::string& textMessage) {
if (GetConfig()->DebugEnabled) { // if (GetConfig()->DebugEnabled) {
blog(LOG_INFO, "Request >> '%s'", textMessage.c_str()); // blog(LOG_INFO, "Request >> '%s'", textMessage.c_str());
} // }
OBSDataAutoRelease responseData = processRequest(textMessage); // OBSDataAutoRelease responseData = processRequest(textMessage);
std::string response = obs_data_get_json(responseData); // std::string response = obs_data_get_json(responseData);
if (GetConfig()->DebugEnabled) { // if (GetConfig()->DebugEnabled) {
blog(LOG_INFO, "Response << '%s'", response.c_str()); // blog(LOG_INFO, "Response << '%s'", response.c_str());
} // }
return response; // return response;
} // }
HandlerResponse WSRequestHandler::processRequest(std::string& textMessage){ RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){
std::string msgContainer(textMessage); // std::string msgContainer(textMessage);
const char* msg = msgContainer.c_str(); // const char* msg = msgContainer.c_str();
data = obs_data_create_from_json(msg); // data = obs_data_create_from_json(msg);
if (!data) { // if (!data) {
blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg); // blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg);
return SendErrorResponse("invalid JSON payload"); // return SendErrorResponse("invalid JSON payload");
} // }
if (!hasField("request-type") || !hasField("message-id")) { if (!hasField("request-type") || !hasField("message-id")) {
return SendErrorResponse("missing request parameters"); return SendErrorResponse("missing request parameters");
} }
_requestType = obs_data_get_string(data, "request-type"); // _requestType = obs_data_get_string(data, "request-type");
_messageId = obs_data_get_string(data, "message-id"); // _messageId = obs_data_get_string(data, "message-id");
if (GetConfig()->AuthRequired if (GetConfig()->AuthRequired
&& (!authNotRequired.contains(_requestType)) && (!authNotRequired.contains(request.methodName()))
&& (!_connProperties.isAuthenticated())) && (!_connProperties.isAuthenticated()))
{ {
return SendErrorResponse("Not Authenticated"); return RpcResponse::fail(request, "Not Authenticated");
} }
HandlerResponse (*handlerFunc)(WSRequestHandler*) = (messageMap[_requestType]); RpcResponse (*handlerFunc)(const RpcRequest&) = (messageMap[request.methodName()]);
if (!handlerFunc) { if (!handlerFunc) {
return SendErrorResponse("invalid request type"); return RpcResponse::fail(request, "invalid request type");
} }
return handlerFunc(this); return handlerFunc(request);
} }
WSRequestHandler::~WSRequestHandler() { // HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) {
} // return SendResponse("ok", additionalFields);
// }
HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) { // HandlerResponse WSRequestHandler::SendErrorResponse(QString errorMessage) {
return SendResponse("ok", additionalFields); // OBSDataAutoRelease fields = obs_data_create();
} // obs_data_set_string(fields, "error", errorMessage.toUtf8().constData());
HandlerResponse WSRequestHandler::SendErrorResponse(QString errorMessage) { // return SendResponse("error", fields);
OBSDataAutoRelease fields = obs_data_create(); // }
obs_data_set_string(fields, "error", errorMessage.toUtf8().constData());
return SendResponse("error", fields); // HandlerResponse WSRequestHandler::SendErrorResponse(obs_data_t* additionalFields) {
} // return SendResponse("error", additionalFields);
// }
HandlerResponse WSRequestHandler::SendErrorResponse(obs_data_t* additionalFields) { // HandlerResponse WSRequestHandler::SendResponse(const char* status, obs_data_t* fields) {
return SendResponse("error", additionalFields); // obs_data_t* response = obs_data_create();
} // obs_data_set_string(response, "message-id", _messageId);
// obs_data_set_string(response, "status", status);
HandlerResponse WSRequestHandler::SendResponse(const char* status, obs_data_t* fields) { // if (fields) {
obs_data_t* response = obs_data_create(); // obs_data_apply(response, fields);
obs_data_set_string(response, "message-id", _messageId); // }
obs_data_set_string(response, "status", status);
if (fields) { // return response;
obs_data_apply(response, fields); // }
}
return response;
}
bool WSRequestHandler::hasField(QString name, obs_data_type expectedFieldType, obs_data_number_type expectedNumberType) {
if (!data || name.isEmpty() || name.isNull()) {
return false;
}
OBSDataItemAutoRelease dataItem = obs_data_item_byname(data, name.toUtf8());
if (!dataItem) {
return false;
}
if (expectedFieldType != OBS_DATA_NULL) {
obs_data_type fieldType = obs_data_item_gettype(dataItem);
if (fieldType != expectedFieldType) {
return false;
}
if (fieldType == OBS_DATA_NUMBER && expectedNumberType != OBS_DATA_NUM_INVALID) {
obs_data_number_type numberType = obs_data_item_numtype(dataItem);
if (numberType != expectedNumberType) {
return false;
}
}
}
return true;
}
bool WSRequestHandler::hasBool(QString fieldName) {
return this->hasField(fieldName, OBS_DATA_BOOLEAN);
}
bool WSRequestHandler::hasString(QString fieldName) {
return this->hasField(fieldName, OBS_DATA_STRING);
}
bool WSRequestHandler::hasNumber(QString fieldName, obs_data_number_type expectedNumberType) {
return this->hasField(fieldName, OBS_DATA_NUMBER, expectedNumberType);
}
bool WSRequestHandler::hasInteger(QString fieldName) {
return this->hasNumber(fieldName, OBS_DATA_NUM_INT);
}
bool WSRequestHandler::hasDouble(QString fieldName) {
return this->hasNumber(fieldName, OBS_DATA_NUM_DOUBLE);
}
bool WSRequestHandler::hasArray(QString fieldName) {
return this->hasField(fieldName, OBS_DATA_ARRAY);
}
bool WSRequestHandler::hasObject(QString fieldName) {
return this->hasField(fieldName, OBS_DATA_OBJECT);
}

View File

@ -30,160 +30,134 @@ with this program. If not, see <https://www.gnu.org/licenses/>
#include "ConnectionProperties.h" #include "ConnectionProperties.h"
#include "rpc/RpcRequest.h"
#include "rpc/RpcResponse.h"
#include "obs-websocket.h" #include "obs-websocket.h"
typedef obs_data_t* HandlerResponse; class WSRequestHandler {
class WSRequestHandler : public QObject {
Q_OBJECT
public: public:
explicit WSRequestHandler(ConnectionProperties& connProperties); explicit WSRequestHandler(ConnectionProperties& connProperties);
~WSRequestHandler(); RpcResponse processRequest(const RpcRequest& textMessage);
std::string processIncomingMessage(std::string& textMessage);
bool hasField(QString fieldName, obs_data_type expectedFieldType = OBS_DATA_NULL,
obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID);
bool hasBool(QString fieldName);
bool hasString(QString fieldName);
bool hasNumber(QString fieldName, obs_data_number_type expectedNumberType = OBS_DATA_NUM_INVALID);
bool hasInteger(QString fieldName);
bool hasDouble(QString fieldName);
bool hasArray(QString fieldName);
bool hasObject(QString fieldName);
HandlerResponse SendOKResponse(obs_data_t* additionalFields = nullptr);
HandlerResponse SendErrorResponse(QString errorMessage);
HandlerResponse SendErrorResponse(obs_data_t* additionalFields = nullptr);
HandlerResponse SendResponse(const char* status, obs_data_t* additionalFields = nullptr);
obs_data_t* parameters() {
return this->data;
}
private: private:
const char* _messageId;
const char* _requestType;
ConnectionProperties& _connProperties; ConnectionProperties& _connProperties;
OBSDataAutoRelease data;
HandlerResponse processRequest(std::string& textMessage); static QHash<QString, RpcResponse(*)(const RpcRequest&)> messageMap;
static QHash<QString, HandlerResponse(*)(WSRequestHandler*)> messageMap;
static QSet<QString> authNotRequired; static QSet<QString> authNotRequired;
static HandlerResponse HandleGetVersion(WSRequestHandler* req); static RpcResponse HandleGetVersion(const RpcRequest&);
static HandlerResponse HandleGetAuthRequired(WSRequestHandler* req); static RpcResponse HandleGetAuthRequired(const RpcRequest&);
static HandlerResponse HandleAuthenticate(WSRequestHandler* req); static RpcResponse HandleAuthenticate(const RpcRequest&);
static HandlerResponse HandleGetStats(WSRequestHandler* req); static RpcResponse HandleGetStats(const RpcRequest&);
static HandlerResponse HandleSetHeartbeat(WSRequestHandler* req); static RpcResponse HandleSetHeartbeat(const RpcRequest&);
static HandlerResponse HandleGetVideoInfo(WSRequestHandler* req); static RpcResponse HandleGetVideoInfo(const RpcRequest&);
static HandlerResponse HandleSetFilenameFormatting(WSRequestHandler* req); static RpcResponse HandleSetFilenameFormatting(const RpcRequest&);
static HandlerResponse HandleGetFilenameFormatting(WSRequestHandler* req); static RpcResponse HandleGetFilenameFormatting(const RpcRequest&);
static HandlerResponse HandleBroadcastCustomMessage(WSRequestHandler* req); static RpcResponse HandleBroadcastCustomMessage(const RpcRequest&);
static HandlerResponse HandleSetCurrentScene(WSRequestHandler* req); static RpcResponse HandleSetCurrentScene(const RpcRequest&);
static HandlerResponse HandleGetCurrentScene(WSRequestHandler* req); static RpcResponse HandleGetCurrentScene(const RpcRequest&);
static HandlerResponse HandleGetSceneList(WSRequestHandler* req); static RpcResponse HandleGetSceneList(const RpcRequest&);
static HandlerResponse HandleSetSceneItemRender(WSRequestHandler* req); static RpcResponse HandleSetSceneItemRender(const RpcRequest&);
static HandlerResponse HandleSetSceneItemPosition(WSRequestHandler* req); static RpcResponse HandleSetSceneItemPosition(const RpcRequest&);
static HandlerResponse HandleSetSceneItemTransform(WSRequestHandler* req); static RpcResponse HandleSetSceneItemTransform(const RpcRequest&);
static HandlerResponse HandleSetSceneItemCrop(WSRequestHandler* req); static RpcResponse HandleSetSceneItemCrop(const RpcRequest&);
static HandlerResponse HandleGetSceneItemProperties(WSRequestHandler* req); static RpcResponse HandleGetSceneItemProperties(const RpcRequest&);
static HandlerResponse HandleSetSceneItemProperties(WSRequestHandler* req); static RpcResponse HandleSetSceneItemProperties(const RpcRequest&);
static HandlerResponse HandleResetSceneItem(WSRequestHandler* req); static RpcResponse HandleResetSceneItem(const RpcRequest&);
static HandlerResponse HandleDuplicateSceneItem(WSRequestHandler* req); static RpcResponse HandleDuplicateSceneItem(const RpcRequest&);
static HandlerResponse HandleDeleteSceneItem(WSRequestHandler* req); static RpcResponse HandleDeleteSceneItem(const RpcRequest&);
static HandlerResponse HandleReorderSceneItems(WSRequestHandler* req); static RpcResponse HandleReorderSceneItems(const RpcRequest&);
static HandlerResponse HandleGetStreamingStatus(WSRequestHandler* req); static RpcResponse HandleGetStreamingStatus(const RpcRequest&);
static HandlerResponse HandleStartStopStreaming(WSRequestHandler* req); static RpcResponse HandleStartStopStreaming(const RpcRequest&);
static HandlerResponse HandleStartStopRecording(WSRequestHandler* req); static RpcResponse HandleStartStopRecording(const RpcRequest&);
static HandlerResponse HandleStartStreaming(WSRequestHandler* req); static RpcResponse HandleStartStreaming(const RpcRequest&);
static HandlerResponse HandleStopStreaming(WSRequestHandler* req); static RpcResponse HandleStopStreaming(const RpcRequest&);
static HandlerResponse HandleStartRecording(WSRequestHandler* req); static RpcResponse HandleStartRecording(const RpcRequest&);
static HandlerResponse HandleStopRecording(WSRequestHandler* req); static RpcResponse HandleStopRecording(const RpcRequest&);
static HandlerResponse HandlePauseRecording(WSRequestHandler* req); static RpcResponse HandlePauseRecording(const RpcRequest&);
static HandlerResponse HandleResumeRecording(WSRequestHandler* req); static RpcResponse HandleResumeRecording(const RpcRequest&);
static HandlerResponse HandleStartStopReplayBuffer(WSRequestHandler* req); static RpcResponse HandleStartStopReplayBuffer(const RpcRequest&);
static HandlerResponse HandleStartReplayBuffer(WSRequestHandler* req); static RpcResponse HandleStartReplayBuffer(const RpcRequest&);
static HandlerResponse HandleStopReplayBuffer(WSRequestHandler* req); static RpcResponse HandleStopReplayBuffer(const RpcRequest&);
static HandlerResponse HandleSaveReplayBuffer(WSRequestHandler* req); static RpcResponse HandleSaveReplayBuffer(const RpcRequest&);
static HandlerResponse HandleSetRecordingFolder(WSRequestHandler* req); static RpcResponse HandleSetRecordingFolder(const RpcRequest&);
static HandlerResponse HandleGetRecordingFolder(WSRequestHandler* req); static RpcResponse HandleGetRecordingFolder(const RpcRequest&);
static HandlerResponse HandleGetTransitionList(WSRequestHandler* req); static RpcResponse HandleGetTransitionList(const RpcRequest&);
static HandlerResponse HandleGetCurrentTransition(WSRequestHandler* req); static RpcResponse HandleGetCurrentTransition(const RpcRequest&);
static HandlerResponse HandleSetCurrentTransition(WSRequestHandler* req); static RpcResponse HandleSetCurrentTransition(const RpcRequest&);
static HandlerResponse HandleSetVolume(WSRequestHandler* req); static RpcResponse HandleSetVolume(const RpcRequest&);
static HandlerResponse HandleGetVolume(WSRequestHandler* req); static RpcResponse HandleGetVolume(const RpcRequest&);
static HandlerResponse HandleToggleMute(WSRequestHandler* req); static RpcResponse HandleToggleMute(const RpcRequest&);
static HandlerResponse HandleSetMute(WSRequestHandler* req); static RpcResponse HandleSetMute(const RpcRequest&);
static HandlerResponse HandleGetMute(WSRequestHandler* req); static RpcResponse HandleGetMute(const RpcRequest&);
static HandlerResponse HandleSetSyncOffset(WSRequestHandler* req); static RpcResponse HandleSetSyncOffset(const RpcRequest&);
static HandlerResponse HandleGetSyncOffset(WSRequestHandler* req); static RpcResponse HandleGetSyncOffset(const RpcRequest&);
static HandlerResponse HandleGetSpecialSources(WSRequestHandler* req); static RpcResponse HandleGetSpecialSources(const RpcRequest&);
static HandlerResponse HandleGetSourcesList(WSRequestHandler* req); static RpcResponse HandleGetSourcesList(const RpcRequest&);
static HandlerResponse HandleGetSourceTypesList(WSRequestHandler* req); static RpcResponse HandleGetSourceTypesList(const RpcRequest&);
static HandlerResponse HandleGetSourceSettings(WSRequestHandler* req); static RpcResponse HandleGetSourceSettings(const RpcRequest&);
static HandlerResponse HandleSetSourceSettings(WSRequestHandler* req); static RpcResponse HandleSetSourceSettings(const RpcRequest&);
static HandlerResponse HandleTakeSourceScreenshot(WSRequestHandler* req); static RpcResponse HandleTakeSourceScreenshot(const RpcRequest&);
static HandlerResponse HandleGetSourceFilters(WSRequestHandler* req); static RpcResponse HandleGetSourceFilters(const RpcRequest&);
static HandlerResponse HandleGetSourceFilterInfo(WSRequestHandler* req); static RpcResponse HandleGetSourceFilterInfo(const RpcRequest&);
static HandlerResponse HandleAddFilterToSource(WSRequestHandler* req); static RpcResponse HandleAddFilterToSource(const RpcRequest&);
static HandlerResponse HandleRemoveFilterFromSource(WSRequestHandler* req); static RpcResponse HandleRemoveFilterFromSource(const RpcRequest&);
static HandlerResponse HandleReorderSourceFilter(WSRequestHandler* req); static RpcResponse HandleReorderSourceFilter(const RpcRequest&);
static HandlerResponse HandleMoveSourceFilter(WSRequestHandler* req); static RpcResponse HandleMoveSourceFilter(const RpcRequest&);
static HandlerResponse HandleSetSourceFilterSettings(WSRequestHandler* req); static RpcResponse HandleSetSourceFilterSettings(const RpcRequest&);
static HandlerResponse HandleSetSourceFilterVisibility(WSRequestHandler* req); static RpcResponse HandleSetSourceFilterVisibility(const RpcRequest&);
static HandlerResponse HandleSetCurrentSceneCollection(WSRequestHandler* req); static RpcResponse HandleSetCurrentSceneCollection(const RpcRequest&);
static HandlerResponse HandleGetCurrentSceneCollection(WSRequestHandler* req); static RpcResponse HandleGetCurrentSceneCollection(const RpcRequest&);
static HandlerResponse HandleListSceneCollections(WSRequestHandler* req); static RpcResponse HandleListSceneCollections(const RpcRequest&);
static HandlerResponse HandleSetCurrentProfile(WSRequestHandler* req); static RpcResponse HandleSetCurrentProfile(const RpcRequest&);
static HandlerResponse HandleGetCurrentProfile(WSRequestHandler* req); static RpcResponse HandleGetCurrentProfile(const RpcRequest&);
static HandlerResponse HandleListProfiles(WSRequestHandler* req); static RpcResponse HandleListProfiles(const RpcRequest&);
static HandlerResponse HandleSetStreamSettings(WSRequestHandler* req); static RpcResponse HandleSetStreamSettings(const RpcRequest&);
static HandlerResponse HandleGetStreamSettings(WSRequestHandler* req); static RpcResponse HandleGetStreamSettings(const RpcRequest&);
static HandlerResponse HandleSaveStreamSettings(WSRequestHandler* req); static RpcResponse HandleSaveStreamSettings(const RpcRequest&);
#if BUILD_CAPTIONS #if BUILD_CAPTIONS
static HandlerResponse HandleSendCaptions(WSRequestHandler * req); static RpcResponse HandleSendCaptions(WSRequestHandler * req);
#endif #endif
static HandlerResponse HandleSetTransitionDuration(WSRequestHandler* req); static RpcResponse HandleSetTransitionDuration(const RpcRequest& request);
static HandlerResponse HandleGetTransitionDuration(WSRequestHandler* req); static RpcResponse HandleGetTransitionDuration(const RpcRequest& request);
static HandlerResponse HandleGetStudioModeStatus(WSRequestHandler* req); static RpcResponse HandleGetStudioModeStatus(const RpcRequest& request);
static HandlerResponse HandleGetPreviewScene(WSRequestHandler* req); static RpcResponse HandleGetPreviewScene(const RpcRequest& request);
static HandlerResponse HandleSetPreviewScene(WSRequestHandler* req); static RpcResponse HandleSetPreviewScene(const RpcRequest& request);
static HandlerResponse HandleTransitionToProgram(WSRequestHandler* req); static RpcResponse HandleTransitionToProgram(const RpcRequest& request);
static HandlerResponse HandleEnableStudioMode(WSRequestHandler* req); static RpcResponse HandleEnableStudioMode(const RpcRequest& request);
static HandlerResponse HandleDisableStudioMode(WSRequestHandler* req); static RpcResponse HandleDisableStudioMode(const RpcRequest& request);
static HandlerResponse HandleToggleStudioMode(WSRequestHandler* req); static RpcResponse HandleToggleStudioMode(const RpcRequest& request);
static HandlerResponse HandleSetTextGDIPlusProperties(WSRequestHandler* req); static RpcResponse HandleSetTextGDIPlusProperties(const RpcRequest& request);
static HandlerResponse HandleGetTextGDIPlusProperties(WSRequestHandler* req); static RpcResponse HandleGetTextGDIPlusProperties(const RpcRequest& request);
static HandlerResponse HandleSetTextFreetype2Properties(WSRequestHandler* req); static RpcResponse HandleSetTextFreetype2Properties(const RpcRequest& request);
static HandlerResponse HandleGetTextFreetype2Properties(WSRequestHandler* req); static RpcResponse HandleGetTextFreetype2Properties(const RpcRequest& request);
static HandlerResponse HandleSetBrowserSourceProperties(WSRequestHandler* req); static RpcResponse HandleSetBrowserSourceProperties(const RpcRequest& request);
static HandlerResponse HandleGetBrowserSourceProperties(WSRequestHandler* req); static RpcResponse HandleGetBrowserSourceProperties(const RpcRequest& request);
static HandlerResponse HandleListOutputs(WSRequestHandler* req); static RpcResponse HandleListOutputs(const RpcRequest& request);
static HandlerResponse HandleGetOutputInfo(WSRequestHandler* req); static RpcResponse HandleGetOutputInfo(const RpcRequest& request);
static HandlerResponse HandleStartOutput(WSRequestHandler* req); static RpcResponse HandleStartOutput(const RpcRequest& request);
static HandlerResponse HandleStopOutput(WSRequestHandler* req); static RpcResponse HandleStopOutput(const RpcRequest& request);
}; };