diff --git a/server/gamesapi/app/app.go b/server/gamesapi/app/app.go index 3c3f7a84..179d432c 100644 --- a/server/gamesapi/app/app.go +++ b/server/gamesapi/app/app.go @@ -3,7 +3,6 @@ package app import ( "f5" //. "main/global" - "main/middleware" "mt" ) @@ -30,7 +29,6 @@ func (this *app) Init() { f5.LoadMetaTable(mt.Table) this.registerDataSources() this.initCb() - f5.GetApp().GetGinEngine().Use(middleware.CaCheck) } func (this *app) UnInit() { diff --git a/server/gamesapi/common/types.go b/server/gamesapi/common/types.go index 15f0eeb6..e8696e44 100644 --- a/server/gamesapi/common/types.go +++ b/server/gamesapi/common/types.go @@ -6,3 +6,6 @@ type App interface { type RouterGroup interface { } + +type ServiceMgr interface { +} diff --git a/server/gamesapi/constant/constant.go b/server/gamesapi/constant/constant.go index 1c284727..c8140346 100644 --- a/server/gamesapi/constant/constant.go +++ b/server/gamesapi/constant/constant.go @@ -1,12 +1,9 @@ package constant -const ( - MAIL_DB = "maildb" -) - const ( APP_MODULE_IDX = iota ROUTER_MODULE_IDX CONTROLLER_MGR_MODULE_IDX + SERVICE_MGR_MODULE_IDX MAX_MODULE_IDX ) diff --git a/server/gamesapi/global/global.go b/server/gamesapi/global/global.go index 5f713443..82033a59 100644 --- a/server/gamesapi/global/global.go +++ b/server/gamesapi/global/global.go @@ -9,15 +9,21 @@ import ( var modules [constant.MAX_MODULE_IDX]q5.Module var initOrders = []int32{ + constant.SERVICE_MGR_MODULE_IDX, constant.ROUTER_MODULE_IDX, } var app common.App +var serviceMgr common.ServiceMgr func GetApp() common.App { return app } +func GetServiceMgr() common.ServiceMgr { + return serviceMgr +} + func RegModule(idx int32, m q5.Module) { fmt.Printf("RegModule module %d\n", idx) modules[idx] = m @@ -28,7 +34,7 @@ func RegModule(idx int32, m q5.Module) { } case constant.ROUTER_MODULE_IDX: { - + serviceMgr = m.(common.ServiceMgr) } default: { diff --git a/server/gamesapi/middleware/caauth.go b/server/gamesapi/middleware/caauth.go index 2e45647a..b851f0da 100644 --- a/server/gamesapi/middleware/caauth.go +++ b/server/gamesapi/middleware/caauth.go @@ -1,133 +1,4 @@ package middleware import ( - "f5" - "fmt" - "mt" - "net/http" - "q5" - "time" - - //. "main/global" - - "github.com/gin-gonic/gin" ) - -type RedirectInfo struct { - trace_id string - ori_req *gin.Context - sig string - sigtime int64 -} - -var requestCache = q5.ConcurrentMap[string, []*RedirectInfo]{} -var redirectRequest = q5.ConcurrentMap[string, *RedirectInfo]{} - -func CaCheck(c *gin.Context) { - accountId := c.DefaultQuery("account_id", "") - - if accountId == "" || !lockAccount(accountId) { - c.JSON(http.StatusOK, gin.H{ - "errcode": 1004, - "errmsg": "Too many requests", - }) - return - } - - emptyreq := false - - defer unlockAccount(accountId, emptyreq) - - cache, exist := requestCache.Load(accountId) - if !exist { - pcache := make([]*RedirectInfo, 0, mt.Table.Config.GetMaxCache()) - cache = &pcache - } - - info := new(RedirectInfo) - info.ori_req = c - info.sigtime = f5.GetApp().GetRealSeconds() - info.trace_id = fmt.Sprintf("%x%02x-%s", info.sigtime, len(*cache), accountId) - info.sig = q5.Md5Str(c.Request.URL.RawQuery + info.trace_id) - - if len(*cache) < int(mt.Table.Config.GetMaxCache()) { - *cache = append(*cache, info) - requestCache.Store(accountId, *cache) - unlockAccount(accountId, emptyreq) - - for { - time.Sleep(time.Millisecond * 100) - - if lockAccount(accountId) { - reqlist, _ := requestCache.Load(accountId) - if len(*reqlist) > 0 && (*reqlist)[0].trace_id == info.trace_id { - req := (*reqlist)[0] - (*reqlist) = (*reqlist)[1:] - - if req.sigtime+int64(mt.Table.Config.GetById(0).GetRequestOverTime()) > f5.GetApp().GetRealSeconds() { - redirectRequest.Store(accountId, req) - CaForward(req.ori_req, req.sig, req.trace_id) - redirectRequest.Delete(accountId) - } else { - req.ori_req.JSON(http.StatusOK, gin.H{ - "errcode": 1004, - "errmsg": "Too many players", - }) - } - - if len(*reqlist) > 0 { - requestCache.Store(accountId, *reqlist) - } else { - requestCache.Delete(accountId) - emptyreq = true - } - - return - } - - unlockAccount(accountId, emptyreq) - } - } - } else { - c.JSON(http.StatusOK, gin.H{ - "errcode": 1004, - "errmsg": "Too many requests", - }) - } -} - -func VerifySig(c *gin.Context) { - accountId := c.DefaultQuery("account_id", "") - traceId := c.DefaultQuery("trace_id", "") - sig := c.DefaultQuery("sig", "") - - if accountId == "" || traceId == "" || sig == "" { - c.JSON(http.StatusOK, gin.H{ - "errcode": 1002, - "errmsg": "empty params", - }) - return - } - - failresp := gin.H{ - "errcode": 1002, - "errmsg": "sig unavailable", - } - - req, exist := redirectRequest.Load(accountId) - if !exist { - c.JSON(http.StatusOK, failresp) - return - } - - if (*req).sig != sig || (*req).trace_id != traceId || - (*req).sigtime+int64(mt.Table.Config.GetById(0).GetRequestOverTime()) < f5.GetApp().GetRealSeconds() { - c.JSON(http.StatusOK, failresp) - return - } - - c.JSON(http.StatusOK, gin.H{ - "errcode": 0, - "errmsg": "", - }) -} diff --git a/server/gamesapi/middleware/caforward.go b/server/gamesapi/middleware/caforward.go index 4c5520eb..ed3fd6cd 100644 --- a/server/gamesapi/middleware/caforward.go +++ b/server/gamesapi/middleware/caforward.go @@ -5,47 +5,100 @@ import ( "mt" "net/http" "q5" - + "main/service" + "jccommon" + "io/ioutil" + "bytes" + net_url "net/url" + "strings" + "errors" "github.com/gin-gonic/gin" ) -func CaForward(c *gin.Context, sig string, traceid string) { +func CaForward(c *gin.Context) { + accountId := c.DefaultQuery("account_id", "") + sessionId := c.DefaultQuery("session_id", "") - queryParams := c.Request.URL.Query() - params := map[string]string{} - for k, v := range queryParams { - params[k] = v[0] - } - if sig != "" { - params["sig"] = sig - params["trace_id"] = traceid + if !jccommon.IsValidSessionId(accountId, sessionId) { + f5.RspErr(c, 500, "invalid session_id") + c.Abort() + service.SApiForward.IncInvalidSessionTimes() + return } - fullrequrl := mt.Table.Config.GetById(0).GetRedirectUrl() + c.Request.URL.Path[5:] - cb := func(rsp f5.HttpCliResponse) { - if rsp.GetErr() != nil { - c.JSON(http.StatusOK, gin.H{ - "errcode": 1004, - "errmsg": rsp.GetErr(), - }) + service.SApiForward.IncTotalTimes() + beginTick := q5.GetTickCount() + defer func() { + costTime := q5.GetTickCount() - beginTick + service.SApiForward.UpdateCostTime(costTime) + }() + newUrl := mt.Table.Config.GetById(0).GetRedirectUrl() + c.Request.URL.Path[5:] + if !q5.StrContains(newUrl, "?") { + newUrl = newUrl + "?" + } + { + u := net_url.Values{} + for k, v := range c.Request.URL.Query() { + u.Set(k, v[0]) + } + newUrl += u.Encode() + } + + var httpRequest *http.Request + var createErr error + switch strings.ToUpper(c.Request.Method) { + case "GET": { + httpRequest, createErr = http.NewRequest("GET", newUrl, nil) + if !f5.IsOnlineEnv() { + f5.GetSysLog().Info("CaForward method:%s newUrl:%s ", c.Request.Method, newUrl) + } + } + case "POST": { + if postData, err := c.GetRawData(); err == nil { + httpRequest, createErr = http.NewRequest("POST", newUrl, bytes.NewBuffer(postData)) + contentType := c.GetHeader("Content-Type") + if contentType != "" { + httpRequest.Header.Set("Content-Type", contentType) + } + if !f5.IsOnlineEnv() { + f5.GetSysLog().Info("CaForward method:%s newUrl:%s Content-Type:%s postData:%s", + c.Request.Method, + newUrl, + contentType, + postData) + } + } else { + createErr = err + } + } + default: { + createErr = errors.New("method error") + } + } + if createErr != nil { + f5.RspErr(c, 500, "create request error") + c.Abort() + f5.GetSysLog().Info("CaForward create request url:%s error:%s", newUrl, createErr) + return + } + client := &http.Client{} + if resp, err := client.Do(httpRequest); err == nil { + defer resp.Body.Close() + if bytes, err := ioutil.ReadAll(resp.Body); err == nil { + c.String(200, string(bytes)) + c.Abort() + return + } else { + f5.RspErr(c, 500, "read response error") + c.Abort() + f5.GetSysLog().Info("CaForward read response url:%s eror:%s", newUrl, err) return } - - c.String(http.StatusOK, rsp.GetRawData()) + } else { + f5.RspErr(c, 500, "client.Do error") + c.Abort() + f5.GetSysLog().Info("CaForward client.Do url:%s error:%s", newUrl, err) + return } - switch c.Request.Method { - case "GET": - f5.GetHttpCliMgr().SendGoStyleRequest( - fullrequrl, - params, - cb) - case "POST": - f5.GetHttpCliMgr().SendGoStylePost( - fullrequrl, - params, - c.ContentType(), - q5.GetPostBody(c.Request), - cb) - } } diff --git a/server/gamesapi/middleware/calock.go b/server/gamesapi/middleware/calock.go deleted file mode 100644 index 908cd48a..00000000 --- a/server/gamesapi/middleware/calock.go +++ /dev/null @@ -1,27 +0,0 @@ -package middleware - -import ( - "q5" - "sync" -) - -var accountMutexmap q5.ConcurrentMap[string, *sync.Mutex] - -func lockAccount(account string) bool { - mutex, exist := accountMutexmap.Load(account) - if !exist { - tmp := new(sync.Mutex) - mutex = &tmp - } - return (*mutex).TryLock() -} - -func unlockAccount(account string, del bool) { - mutex, exist := accountMutexmap.Load(account) - if exist { - (*mutex).Unlock() - if del { - accountMutexmap.Delete(account) - } - } -} diff --git a/server/gamesapi/router/routermgr.go b/server/gamesapi/router/routermgr.go index ab334f7c..48471ef2 100644 --- a/server/gamesapi/router/routermgr.go +++ b/server/gamesapi/router/routermgr.go @@ -13,8 +13,7 @@ type routerMgr struct { func (this *routerMgr) Init() { redirectGroup := f5.GetApp().GetGinEngine().Group("/sapi") - redirectGroup.Any("webapp/index.php?", middleware.CaCheck) - redirectGroup.Any("check", middleware.VerifySig) + redirectGroup.Any("webapp/index.php?", middleware.CaForward) f5.GetSysLog().Info("routerMgr.init") } diff --git a/server/gamesapi/service/export.go b/server/gamesapi/service/export.go new file mode 100644 index 00000000..bbfe94fe --- /dev/null +++ b/server/gamesapi/service/export.go @@ -0,0 +1,13 @@ +package service + +import ( + "main/constant" + "main/global" +) + +var _serviceMgr = new(serviceMgr) +var SApiForward *sApiForward + +func init() { + global.RegModule(constant.SERVICE_MGR_MODULE_IDX, _serviceMgr) +} diff --git a/server/gamesapi/service/sapi_forward.go b/server/gamesapi/service/sapi_forward.go new file mode 100644 index 00000000..d90737b4 --- /dev/null +++ b/server/gamesapi/service/sapi_forward.go @@ -0,0 +1,37 @@ +package service + +type sApiForward struct { + +} + +func (this *sApiForward) IncInvalidSessionTimes() { + +} + +func (this *sApiForward) IncTotalTimes() { + +} + +func (this *sApiForward) IncGetTimes() { + +} + +func (this *sApiForward) IncPostTimes() { + +} + +func (this *sApiForward) IncCreateErrTimes() { + +} + +func (this *sApiForward) IncDoErrTimes() { + +} + +func (this *sApiForward) IncReadRspErrTimes() { + +} + +func (this *sApiForward) UpdateCostTime(costTime int64) { + +} diff --git a/server/gamesapi/service/servicemgr.go b/server/gamesapi/service/servicemgr.go new file mode 100644 index 00000000..755ebe7b --- /dev/null +++ b/server/gamesapi/service/servicemgr.go @@ -0,0 +1,12 @@ +package service + +type serviceMgr struct { +} + +func (this *serviceMgr) Init() { + +} + +func (this *serviceMgr) UnInit() { + +} diff --git a/server/jccommon/utils.go b/server/jccommon/utils.go index c7052a51..8b966629 100644 --- a/server/jccommon/utils.go +++ b/server/jccommon/utils.go @@ -84,3 +84,7 @@ func CalcContributionScore(nfts []*NftStacking) float64 { score = baseScore * (1 + rate) return score } + +func IsValidSessionId(accountId string, sessionId string) bool { + return true +}