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 |