mirror of
https://github.com/EQEmu/Server.git
synced 2026-06-13 10:58:20 +00:00
TCP cleanup, added basis of web interface
This commit is contained in:
@@ -0,0 +1,164 @@
|
||||
#include "web_interface.h"
|
||||
#include "../common/json/json.h"
|
||||
|
||||
#include "web_interface_eqw.h"
|
||||
|
||||
#include <sstream>
|
||||
|
||||
WebInterface::WebInterface(std::shared_ptr<EQ::Net::ServertalkServerConnection> connection)
|
||||
{
|
||||
m_connection = connection;
|
||||
m_connection->OnMessage(ServerOP_WebInterfaceCall, std::bind(&WebInterface::OnCall, this, std::placeholders::_1, std::placeholders::_2));
|
||||
RegisterEQW(this);
|
||||
}
|
||||
|
||||
WebInterface::~WebInterface()
|
||||
{
|
||||
}
|
||||
|
||||
void WebInterface::OnCall(uint16 opcode, EQ::Net::Packet &p)
|
||||
{
|
||||
Json::Value root;
|
||||
try {
|
||||
auto json_str = p.GetCString(0);
|
||||
std::stringstream ss(json_str);
|
||||
ss >> root;
|
||||
}
|
||||
catch (std::exception) {
|
||||
SendError("Could not parse request");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string method;
|
||||
Json::Value params;
|
||||
std::string id;
|
||||
|
||||
try {
|
||||
method = root["method"].asString();
|
||||
if (method.length() == 0) {
|
||||
SendError("Invalid request: method not supplied");
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (std::exception) {
|
||||
SendError("Invalid request: method not supplied");
|
||||
return;
|
||||
}
|
||||
|
||||
//optional "params" -> Json::Value
|
||||
try {
|
||||
params = root["params"];
|
||||
}
|
||||
catch (std::exception) {
|
||||
params = nullptr;
|
||||
}
|
||||
|
||||
//optional "id" needs to be string
|
||||
try {
|
||||
id = root["id"].asString();
|
||||
}
|
||||
catch (std::exception) {
|
||||
id = "";
|
||||
}
|
||||
|
||||
//check for registered method
|
||||
auto iter = m_calls.find(method);
|
||||
if (iter == m_calls.end()) {
|
||||
//if not exist then error
|
||||
SendError("Invalid request: method not found");
|
||||
return;
|
||||
}
|
||||
|
||||
iter->second(this, method, id, params);
|
||||
}
|
||||
|
||||
void WebInterface::Send(const Json::Value &value)
|
||||
{
|
||||
try {
|
||||
std::stringstream ss;
|
||||
ss << value;
|
||||
|
||||
EQ::Net::DynamicPacket p;
|
||||
p.PutString(0, ss.str());
|
||||
m_connection->Send(ServerOP_WebInterfaceCall, p);
|
||||
}
|
||||
catch (std::exception) {
|
||||
//Log error
|
||||
}
|
||||
}
|
||||
|
||||
void WebInterface::SendError(const std::string &message)
|
||||
{
|
||||
Json::Value error;
|
||||
error["error"] = Json::Value();
|
||||
error["error"]["message"] = message;
|
||||
|
||||
Send(error);
|
||||
}
|
||||
|
||||
void WebInterface::SendError(const std::string &message, const std::string &id)
|
||||
{
|
||||
Json::Value error;
|
||||
error["error"] = Json::Value();
|
||||
error["error"]["message"] = message;
|
||||
|
||||
Send(error);
|
||||
}
|
||||
|
||||
void WebInterface::AddCall(const std::string &method, WebInterfaceCall call)
|
||||
{
|
||||
m_calls.insert(std::make_pair(method, call));
|
||||
}
|
||||
|
||||
void WebInterface::SendResponse(const std::string &id, const Json::Value &response)
|
||||
{
|
||||
Json::Value out;
|
||||
if(!id.empty())
|
||||
out["id"] = id;
|
||||
out["response"] = response;
|
||||
|
||||
Send(out);
|
||||
}
|
||||
|
||||
WebInterfaceList::WebInterfaceList()
|
||||
{
|
||||
}
|
||||
|
||||
WebInterfaceList::~WebInterfaceList()
|
||||
{
|
||||
}
|
||||
|
||||
void WebInterfaceList::AddConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> connection)
|
||||
{
|
||||
m_interfaces.insert(std::make_pair(connection->GetUUID(), std::unique_ptr<WebInterface>(new WebInterface(connection))));
|
||||
}
|
||||
|
||||
void WebInterfaceList::RemoveConnection(std::shared_ptr<EQ::Net::ServertalkServerConnection> connection)
|
||||
{
|
||||
auto iter = m_interfaces.find(connection->GetUUID());
|
||||
if (iter != m_interfaces.end()) {
|
||||
m_interfaces.erase(iter);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void WebInterfaceList::SendResponse(const std::string &uuid, std::string &id, const Json::Value &response) {
|
||||
auto iter = m_interfaces.find(uuid);
|
||||
if (iter != m_interfaces.end()) {
|
||||
iter->second->SendResponse(id, response);
|
||||
}
|
||||
}
|
||||
|
||||
void WebInterfaceList::SendError(const std::string &uuid, const std::string &message) {
|
||||
auto iter = m_interfaces.find(uuid);
|
||||
if (iter != m_interfaces.end()) {
|
||||
iter->second->SendError(message);
|
||||
}
|
||||
}
|
||||
|
||||
void WebInterfaceList::SendError(const std::string &uuid, const std::string &message, const std::string &id) {
|
||||
auto iter = m_interfaces.find(uuid);
|
||||
if (iter != m_interfaces.end()) {
|
||||
iter->second->SendError(message, id);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user