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