You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
180 lines
6.3 KiB
180 lines
6.3 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using System.Threading;
|
|
|
|
using Sog;
|
|
using SimpleHttpServer;
|
|
using LitJson;
|
|
using ProtoCSStruct;
|
|
using System.Net.Http;
|
|
using Sog.IO;
|
|
using System.Text;
|
|
using System.Collections;
|
|
using System.Reflection;
|
|
using Org.BouncyCastle.Ocsp;
|
|
using static Sog.IO.GmCommandMgr;
|
|
|
|
namespace Operation
|
|
{
|
|
public class HttpApiInfo
|
|
{
|
|
public string httpApiCmd; //http api 接口命令
|
|
public Func<string, JsonData, HttpResponse, HttpRequest, HttpQueryParams, uint, int> httpApiFunction;//http api 接口函数
|
|
public Func<string, SSHttpApiDbReq, DBOperator, int> httpApiDbReqFunction;//http api db req函数
|
|
public ExtData extData;
|
|
}
|
|
|
|
public class ExtData
|
|
{
|
|
public string token;
|
|
public string method;
|
|
|
|
}
|
|
|
|
//http api 指令注册和管理
|
|
public class HttpApiMgr : Singleton<HttpApiMgr>
|
|
{
|
|
private Dictionary<string, HttpApiInfo> m_allHttpApi;
|
|
|
|
public HttpApiMgr()
|
|
{
|
|
m_allHttpApi = new Dictionary<string, HttpApiInfo>();
|
|
}
|
|
|
|
public void Register(string httpApiCmd, Func<string, JsonData, HttpResponse, HttpRequest, HttpQueryParams, uint, int> httpApiFunction,
|
|
Func<string, SSHttpApiDbReq, DBOperator, int> httpApiDbReqFunction)
|
|
{
|
|
if (httpApiCmd == null)
|
|
{
|
|
TraceLog.Error("HttpApiMgr.Register httpApiCmd {0} invalid gmFun!", httpApiCmd);
|
|
return;
|
|
}
|
|
|
|
string lowcaseCmd = httpApiCmd.ToLower();
|
|
|
|
if (m_allHttpApi.ContainsKey(lowcaseCmd))
|
|
{
|
|
TraceLog.Error("HttpApiMgr.Register httpApiCmd {0} lowcaseCmd {1} already registed!", httpApiCmd, lowcaseCmd);
|
|
return;
|
|
}
|
|
|
|
TraceLog.Debug("HttpApiMgr.Register httpApiCmd {0} lowcaseCmd {1} success", httpApiCmd, lowcaseCmd);
|
|
|
|
HttpApiInfo info = new HttpApiInfo();
|
|
info.httpApiCmd = httpApiCmd;
|
|
info.httpApiFunction = httpApiFunction;
|
|
info.httpApiDbReqFunction = httpApiDbReqFunction;
|
|
|
|
m_allHttpApi.Add(lowcaseCmd, info);
|
|
Resolver.Register(httpApiCmd,httpApiFunction);
|
|
|
|
}
|
|
|
|
public void ClearAll()
|
|
{
|
|
TraceLog.Debug("HttpApiMgr.ClearAll clear all registed httpApiCmd");
|
|
m_allHttpApi.Clear();
|
|
}
|
|
|
|
public int HandlerHttpApiFunction(string httpApiCmd, JsonData jsondata, HttpResponse rsp, HttpRequest request, HttpQueryParams query, uint httpContextId)
|
|
{
|
|
string lowcaseCmd = httpApiCmd.ToLower();
|
|
|
|
if (!m_allHttpApi.ContainsKey(lowcaseCmd))
|
|
{
|
|
TraceLog.Error("HttpApiMgr.HandlerHttpApiFunction httpApiCmd {0} lowcaseCmd {1} not be registed,please check", httpApiCmd, lowcaseCmd);
|
|
return -1;
|
|
}
|
|
|
|
HttpApiInfo info = m_allHttpApi[lowcaseCmd];
|
|
|
|
int ret = 0;
|
|
|
|
if (info.httpApiFunction != null)
|
|
ret = info.httpApiFunction(lowcaseCmd, jsondata, rsp, request, query, httpContextId);
|
|
|
|
TraceLog.Debug("HttpApiMgr.HandlerHttpApiFunction httpApiCmd {0} lowcaseCmd {1} ret {2}", httpApiCmd, lowcaseCmd, ret);
|
|
if (info.extData == null)
|
|
{
|
|
info.extData = new ExtData();
|
|
}
|
|
info.extData.method = request.Method;
|
|
info.extData.token = query.GetValue("token");
|
|
|
|
HandlerHttpAlterLog(httpApiCmd, request.Method,query);
|
|
|
|
return ret;
|
|
}
|
|
|
|
public int HandlerHttpApiDbReqFunction(string httpApiCmd, SSHttpApiDbReq req, DBOperator dbOperator)
|
|
{
|
|
string lowcaseCmd = httpApiCmd.ToLower();
|
|
|
|
if (!m_allHttpApi.ContainsKey(lowcaseCmd))
|
|
{
|
|
TraceLog.Error("HttpApiMgr.HandlerHttpApiDbReqFunction httpApiCmd {0} lowcaseCmd {1} not be registed,please check", httpApiCmd, lowcaseCmd);
|
|
return -1;
|
|
}
|
|
|
|
HttpApiInfo info = m_allHttpApi[lowcaseCmd];
|
|
|
|
int ret = 0;
|
|
|
|
if (info.httpApiDbReqFunction != null)
|
|
ret = info.httpApiDbReqFunction(lowcaseCmd, req, dbOperator);
|
|
|
|
TraceLog.Debug("HttpApiMgr.HandlerHttpApiDbReqFunction httpApiCmd {0} lowcaseCmd {1} ret {2}", httpApiCmd, lowcaseCmd, ret);
|
|
|
|
return ret;
|
|
}
|
|
|
|
private int HandlerHttpAlterLog(string httpApiCmd,string method, HttpQueryParams query)
|
|
{
|
|
string lowcaseCmd = httpApiCmd.ToLower();
|
|
try
|
|
{
|
|
if (Resolver.IsWritLog(httpApiCmd))
|
|
{
|
|
SSHttpApiDbReq reqBak = new SSHttpApiDbReq();
|
|
string account = OperationServerUtils.GetAccount(query.GetValue("token"));
|
|
if (query.Count == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (httpApiCmd == "server_monitor" && !query.m_map.ContainsKey("GmUid"))
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
foreach (var keyValuePair in query.m_map)
|
|
{
|
|
if (reqBak.Data.Count > reqBak.Data.GetMaxCount())
|
|
{
|
|
break;
|
|
}
|
|
//不要把密码打到日志中
|
|
if (keyValuePair.Key == "password")
|
|
{
|
|
reqBak.Data.Add("*****");
|
|
continue;
|
|
}
|
|
reqBak.Data.Add(keyValuePair.Value);
|
|
}
|
|
byte[] gameDataByte = StructMessageParseUtils.ToByteArray(ref reqBak);
|
|
gameDataByte = ZipUtils.CompressBytes(gameDataByte);
|
|
OperationServerUtils.GetDbOp().InsertOperationLog(account,method, lowcaseCmd, gameDataByte);
|
|
|
|
}
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
TraceLog.Debug(
|
|
"HttpApiMgr.HandlerHttpApiDbReqFunction push operation log error {0} lowcaseCmd {1} ret {2},err={3}", httpApiCmd, lowcaseCmd, 0, e.Message);
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|