HomeServer/lualib-src/Server-main/Lib/Http/HttpServer.lua

138 lines
4.4 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
local skynet = require "skynet"
local oo = require "Class"
local socket = require "skynet.socket"
local httpd = require "http.httpd"
local sockethelper = require "http.sockethelper"
local urllib = require "http.url"
local table = table
local string = string
local json =require "json"
local cmd = require "GameCmd"
local crypt = require "skynet.crypt"
local log = require "Log"
local errorInfo = require "ErrorInfo"
local serverId = tonumber(skynet.getenv "serverId")
local HttpServer = oo.class()
HttpServer.desKey = "af4eQcgF"
function HttpServer:Init()
end
--URL是否带参数
function HttpServer:IsUrlParam( url )
if string.find(url,"?") then
return true
else
return false
end
end
function HttpServer:Translate(recv)
local t = {}
local s1 =""
local s2 =""
local startPos = 0
local endPos = 0
local endRepeat = false
repeat
endPos = string.find(recv,"=",startPos + 1)
if nil == endPos then
return nil
end
local t1 = string.sub(recv,startPos+1,endPos-1)
startPos = endPos
endPos = string.find(recv,"&",startPos+1)
if nil == endPos then
endPos = #recv + 1
endRepeat = true
end
local t2 = string.sub(recv,startPos+1 ,endPos-1)
startPos = endPos
t [t1] = tonumber(t2) or t2
until endRepeat
return t
end
function HttpServer:desencode(key, text, padding)
local c = crypt.desencode(key, text, crypt.padding[padding or "iso7816_4"])
return crypt.base64encode(c)
end
function HttpServer:desdecode(key, text, padding)
text = crypt.base64decode(text)
return crypt.desdecode(key, text, crypt.padding[padding or "iso7816_4"])
end
function HttpServer:Recv(url , c2sData , addr , header )
url = string.gsub(url ,"/","")
c2sData = c2sData or {}
local s2cData = {}
if header["x-real-ip"] then
--log.info("接收来自Ngix转发的玩家真实IP地址",header["x-real-ip"])
addr = header["x-real-ip"]
end
--检查IP是否进入了黑名单
local isBlack = skynet.server.defense:IsIPBlackList( addr )
if isBlack then
s2cData.code = errorInfo.ErrorCode.BlackList
return json:encode(s2cData)
end
--检查URL是否带参数是就进行处理
if self:IsUrlParam(url) then
url,c2sData = skynet.server.common:ParseUrlParam(url) --如果URL带参数就用URL带的参数
end
if not cmd[ url ] then
--不存在该接口
skynet.server.defense:CheckAttack( skynet.server.defense.TriggerType_ErrorRequest , addr )
s2cData.code = errorInfo.ErrorCode.NoExistInterface
return json:encode(s2cData)
end
local t1 = skynet.GetTime()
local t2 = os.clock()
--根据消息类型进行分发
if cmd[url] == cmd.Center then
s2cData = skynet.server.centerServer:HttpRecv( c2sData , url , addr )
elseif cmd[url] == cmd.Route then
s2cData = skynet.server.routeServer:HttpRecv( c2sData , url , addr )
elseif cmd[url] == cmd.Multi then
s2cData = skynet.server.multiServer:HttpRecv( c2sData , url , addr )
elseif cmd[url] == cmd.Pay then
s2cData = skynet.server.payServer:HttpRecv( c2sData , url , addr )
end
if cmd[url] == cmd.Pay then --充值服返回单独处理
if s2cData and s2cData.state.code then
if 0 == s2cData.state.code then
s2cData.state.msg = "成功接收通知"
elseif 1 == s2cData.state.code then
s2cData.state.msg = "发货成功"
elseif 2 == s2cData.state.code then
s2cData.state.msg = "发货失败"
end
log.info(string.format("消息返回 类型 %d 时间 %d %f 返回值 %s",cmd[url] , skynet.GetTime() - t1 , os.clock() - t2 ,skynet.server.common:TableToString(s2cData)))
return json:encode(s2cData)
end
else
--通用返回处理
if s2cData and s2cData.code then
s2cData.msg = errorInfo.ErrorMsg[s2cData.code] or "暂无消息提示"
log.info(string.format("消息返回 类型 %d 时间 %d %f 返回值 %s",cmd[url] , skynet.GetTime() - t1 , os.clock() - t2 ,skynet.server.common:TableToString(s2cData)))
if "metrics" == url then
return s2cData.data
else
return json:encode(s2cData)
end
end
end
end
skynet.server.httpServer = HttpServer
return HttpServer