138 lines
4.4 KiB
Lua
138 lines
4.4 KiB
Lua
|
|
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
|