mirror of
https://github.com/Palakis/obs-websocket.git
synced 2024-08-30 18:12:16 +00:00
WSServer: reimplement protocol
This commit is contained in:
parent
2f244ae37e
commit
5864864123
@ -48,6 +48,7 @@ set(obs-websocket_SOURCES
|
||||
src/Utils.cpp
|
||||
src/rpc/RpcRequest.cpp
|
||||
src/rpc/RpcResponse.h
|
||||
src/protocol/OBSRemoteProtocol.cpp
|
||||
src/forms/settings-dialog.cpp)
|
||||
|
||||
set(obs-websocket_HEADERS
|
||||
@ -60,6 +61,7 @@ set(obs-websocket_HEADERS
|
||||
src/Utils.h
|
||||
src/rpc/RpcRequest.h
|
||||
src/rpc/RpcResponse.h
|
||||
src/protocol/OBSRemoteProtocol.h
|
||||
src/forms/settings-dialog.h)
|
||||
|
||||
# --- Platform-independent build settings ---
|
||||
|
@ -156,38 +156,7 @@ WSRequestHandler::WSRequestHandler(ConnectionProperties& connProperties) :
|
||||
{
|
||||
}
|
||||
|
||||
// std::string WSRequestHandler::processIncomingMessage(std::string& textMessage) {
|
||||
// if (GetConfig()->DebugEnabled) {
|
||||
// blog(LOG_INFO, "Request >> '%s'", textMessage.c_str());
|
||||
// }
|
||||
|
||||
// OBSDataAutoRelease responseData = processRequest(textMessage);
|
||||
// std::string response = obs_data_get_json(responseData);
|
||||
|
||||
// if (GetConfig()->DebugEnabled) {
|
||||
// blog(LOG_INFO, "Response << '%s'", response.c_str());
|
||||
// }
|
||||
|
||||
// return response;
|
||||
// }
|
||||
|
||||
RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){
|
||||
// std::string msgContainer(textMessage);
|
||||
// const char* msg = msgContainer.c_str();
|
||||
|
||||
// data = obs_data_create_from_json(msg);
|
||||
// if (!data) {
|
||||
// blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg);
|
||||
// return SendErrorResponse("invalid JSON payload");
|
||||
// }
|
||||
|
||||
// if (!hasField("request-type") || !hasField("message-id")) {
|
||||
// return SendErrorResponse("missing request parameters");
|
||||
// }
|
||||
|
||||
// _requestType = obs_data_get_string(data, "request-type");
|
||||
// _messageId = obs_data_get_string(data, "message-id");
|
||||
|
||||
if (GetConfig()->AuthRequired
|
||||
&& (!authNotRequired.contains(request.methodName()))
|
||||
&& (!_connProperties.isAuthenticated()))
|
||||
@ -202,30 +171,3 @@ RpcResponse WSRequestHandler::processRequest(const RpcRequest& request){
|
||||
|
||||
return std::bind(handlerFunc, this, _1)(request);
|
||||
}
|
||||
|
||||
// HandlerResponse WSRequestHandler::SendOKResponse(obs_data_t* additionalFields) {
|
||||
// return SendResponse("ok", additionalFields);
|
||||
// }
|
||||
|
||||
// HandlerResponse WSRequestHandler::SendErrorResponse(QString errorMessage) {
|
||||
// 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::SendResponse(const char* status, obs_data_t* fields) {
|
||||
// obs_data_t* response = obs_data_create();
|
||||
// obs_data_set_string(response, "message-id", _messageId);
|
||||
// obs_data_set_string(response, "status", status);
|
||||
|
||||
// if (fields) {
|
||||
// obs_data_apply(response, fields);
|
||||
// }
|
||||
|
||||
// return response;
|
||||
// }
|
||||
|
@ -31,6 +31,7 @@ with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
#include "obs-websocket.h"
|
||||
#include "Config.h"
|
||||
#include "Utils.h"
|
||||
#include "protocol/OBSRemoteProtocol.h"
|
||||
|
||||
QT_USE_NAMESPACE
|
||||
|
||||
@ -171,8 +172,17 @@ void WSServer::onMessage(connection_hdl hdl, server::message_ptr message)
|
||||
ConnectionProperties& connProperties = _connectionProperties[hdl];
|
||||
locker.unlock();
|
||||
|
||||
WSRequestHandler handler(connProperties);
|
||||
std::string response = handler.processIncomingMessage(payload);
|
||||
if (GetConfig()->DebugEnabled) {
|
||||
blog(LOG_INFO, "Request >> '%s'", payload.c_str());
|
||||
}
|
||||
|
||||
WSRequestHandler requestHandler(connProperties);
|
||||
OBSRemoteProtocol protocol(requestHandler);
|
||||
std::string response = protocol.processMessage(payload);
|
||||
|
||||
if (GetConfig()->DebugEnabled) {
|
||||
blog(LOG_INFO, "Response << '%s'", response.c_str());
|
||||
}
|
||||
|
||||
websocketpp::lib::error_code errorCode;
|
||||
_server.send(hdl, response, websocketpp::frame::opcode::text, errorCode);
|
||||
|
82
src/protocol/OBSRemoteProtocol.cpp
Normal file
82
src/protocol/OBSRemoteProtocol.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
obs-websocket
|
||||
Copyright (C) 2016-2019 Stéphane Lepin <stephane.lepin@gmail.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
#include "OBSRemoteProtocol.h"
|
||||
#include "../WSRequestHandler.h"
|
||||
|
||||
std::string buildResponse(QString messageId, QString status, obs_data_t* fields = nullptr) {
|
||||
obs_data_t* response = obs_data_create();
|
||||
obs_data_set_string(response, "message-id", messageId.toUtf8().constData());
|
||||
obs_data_set_string(response, "status", status.toUtf8().constData());
|
||||
|
||||
if (fields) {
|
||||
obs_data_apply(response, fields);
|
||||
}
|
||||
|
||||
std::string responseString = obs_data_get_json(response);
|
||||
return responseString;
|
||||
}
|
||||
|
||||
std::string successResponse(QString messageId, obs_data_t* fields = nullptr) {
|
||||
return buildResponse(messageId, "ok", fields);
|
||||
}
|
||||
|
||||
std::string errorResponse(QString messageId, QString errorMessage, obs_data_t* additionalFields = nullptr) {
|
||||
OBSDataAutoRelease fields = obs_data_create();
|
||||
obs_data_set_string(fields, "error", errorMessage.toUtf8().constData());
|
||||
return buildResponse(messageId, "error", fields);
|
||||
}
|
||||
|
||||
OBSRemoteProtocol::OBSRemoteProtocol(WSRequestHandler& requestHandler) :
|
||||
_requestHandler(requestHandler)
|
||||
{
|
||||
}
|
||||
|
||||
std::string OBSRemoteProtocol::processMessage(std::string message)
|
||||
{
|
||||
std::string msgContainer(message);
|
||||
const char* msg = msgContainer.c_str();
|
||||
|
||||
OBSDataAutoRelease data = obs_data_create_from_json(msg);
|
||||
if (!data) {
|
||||
blog(LOG_ERROR, "invalid JSON payload received for '%s'", msg);
|
||||
return errorResponse(nullptr, "invalid JSON payload");
|
||||
}
|
||||
|
||||
if (!obs_data_has_user_value(data, "request-type") || !obs_data_has_user_value(data, "message-id")) {
|
||||
return errorResponse(nullptr, "missing request parameters");
|
||||
}
|
||||
|
||||
QString methodName = obs_data_get_string(data, "request-type");
|
||||
QString messageId = obs_data_get_string(data, "message-id");
|
||||
|
||||
OBSDataAutoRelease params = obs_data_create();
|
||||
|
||||
RpcRequest request(messageId, methodName, params);
|
||||
RpcResponse response = _requestHandler.processRequest(request);
|
||||
|
||||
OBSData additionalFields = response.additionalFields();
|
||||
switch (response.status()) {
|
||||
case Ok:
|
||||
return successResponse(messageId, additionalFields);
|
||||
case Error:
|
||||
return errorResponse(messageId, response.errorMessage(), additionalFields);
|
||||
}
|
||||
|
||||
return std::string();
|
||||
}
|
34
src/protocol/OBSRemoteProtocol.h
Normal file
34
src/protocol/OBSRemoteProtocol.h
Normal file
@ -0,0 +1,34 @@
|
||||
/*
|
||||
obs-websocket
|
||||
Copyright (C) 2016-2019 Stéphane Lepin <stephane.lepin@gmail.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program. If not, see <https://www.gnu.org/licenses/>
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <obs-data.h>
|
||||
|
||||
class WSRequestHandler;
|
||||
|
||||
class OBSRemoteProtocol
|
||||
{
|
||||
public:
|
||||
explicit OBSRemoteProtocol(WSRequestHandler& requestHandler);
|
||||
std::string processMessage(std::string message);
|
||||
|
||||
private:
|
||||
WSRequestHandler& _requestHandler;
|
||||
};
|
@ -57,8 +57,8 @@ public:
|
||||
return _errorMessage;
|
||||
}
|
||||
|
||||
const obs_data_t* parameters() const {
|
||||
return _additionalFields;
|
||||
const OBSData additionalFields() const {
|
||||
return OBSData(_additionalFields);
|
||||
}
|
||||
|
||||
private:
|
||||
|
Loading…
x
Reference in New Issue
Block a user