From fcf9c6eaf6c889a5413cda94f4284ec4dfb38811 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 24 Jul 2024 15:56:43 +0800 Subject: [PATCH 1/5] 1 --- server/gamesapi/app/app.go | 2 - server/gamesapi/middleware/caauth.go | 129 ------------------------ server/gamesapi/middleware/caforward.go | 102 +++++++++++++------ server/gamesapi/router/routermgr.go | 3 +- server/jccommon/utils.go | 4 + 5 files changed, 74 insertions(+), 166 deletions(-) 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/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..da48debf 100644 --- a/server/gamesapi/middleware/caforward.go +++ b/server/gamesapi/middleware/caforward.go @@ -5,47 +5,83 @@ import ( "mt" "net/http" "q5" - + "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() + 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(), - }) + 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) + } + 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) + } + } 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/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/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 +} From 3608008e9d339094ce5128736dcb4074f97a9644 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 24 Jul 2024 15:59:48 +0800 Subject: [PATCH 2/5] 1 --- server/gamesapi/middleware/caforward.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/gamesapi/middleware/caforward.go b/server/gamesapi/middleware/caforward.go index da48debf..29b7e554 100644 --- a/server/gamesapi/middleware/caforward.go +++ b/server/gamesapi/middleware/caforward.go @@ -41,6 +41,9 @@ func CaForward(c *gin.Context) { 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 { @@ -49,6 +52,13 @@ func CaForward(c *gin.Context) { 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 } @@ -57,7 +67,6 @@ func CaForward(c *gin.Context) { createErr = errors.New("method error") } } - if createErr != nil { f5.RspErr(c, 500, "create request error") c.Abort() From f33a17aee48b3122e38174ff943a9cbec36c6b29 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 24 Jul 2024 16:14:34 +0800 Subject: [PATCH 3/5] 1 --- server/gamesapi/common/types.go | 3 +++ server/gamesapi/constant/constant.go | 5 +---- server/gamesapi/global/global.go | 8 +++++++- server/gamesapi/service/export.go | 12 ++++++++++++ server/gamesapi/service/servicemgr.go | 11 +++++++++++ 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 server/gamesapi/service/export.go create mode 100644 server/gamesapi/service/servicemgr.go 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/service/export.go b/server/gamesapi/service/export.go new file mode 100644 index 00000000..405e578e --- /dev/null +++ b/server/gamesapi/service/export.go @@ -0,0 +1,12 @@ +package service + +import ( + "main/constant" + "main/global" +) + +var _serviceMgr = new(serviceMgr) + +func init() { + global.RegModule(constant.SERVICE_MGR_MODULE_IDX, _serviceMgr) +} diff --git a/server/gamesapi/service/servicemgr.go b/server/gamesapi/service/servicemgr.go new file mode 100644 index 00000000..b7128169 --- /dev/null +++ b/server/gamesapi/service/servicemgr.go @@ -0,0 +1,11 @@ +package service + +type serviceMgr struct { +} + +func (this *serviceMgr) Init() { + + +func (this *serviceMgr) UnInit() { + +} From 2432f81b11370177c4d298f949b6dca107f34875 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 24 Jul 2024 16:15:38 +0800 Subject: [PATCH 4/5] 1 --- server/gamesapi/middleware/calock.go | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 server/gamesapi/middleware/calock.go 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) - } - } -} From 525fac21b1c79977456c38c9abcdbefa3028c3b4 Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Wed, 24 Jul 2024 16:27:51 +0800 Subject: [PATCH 5/5] 1 --- server/gamesapi/middleware/caforward.go | 8 ++++++ server/gamesapi/service/export.go | 1 + server/gamesapi/service/sapi_forward.go | 37 +++++++++++++++++++++++++ server/gamesapi/service/servicemgr.go | 1 + 4 files changed, 47 insertions(+) create mode 100644 server/gamesapi/service/sapi_forward.go diff --git a/server/gamesapi/middleware/caforward.go b/server/gamesapi/middleware/caforward.go index 29b7e554..ed3fd6cd 100644 --- a/server/gamesapi/middleware/caforward.go +++ b/server/gamesapi/middleware/caforward.go @@ -5,6 +5,7 @@ import ( "mt" "net/http" "q5" + "main/service" "jccommon" "io/ioutil" "bytes" @@ -21,9 +22,16 @@ func CaForward(c *gin.Context) { if !jccommon.IsValidSessionId(accountId, sessionId) { f5.RspErr(c, 500, "invalid session_id") c.Abort() + service.SApiForward.IncInvalidSessionTimes() return } + 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 + "?" diff --git a/server/gamesapi/service/export.go b/server/gamesapi/service/export.go index 405e578e..bbfe94fe 100644 --- a/server/gamesapi/service/export.go +++ b/server/gamesapi/service/export.go @@ -6,6 +6,7 @@ import ( ) 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 index b7128169..755ebe7b 100644 --- a/server/gamesapi/service/servicemgr.go +++ b/server/gamesapi/service/servicemgr.go @@ -5,6 +5,7 @@ type serviceMgr struct { func (this *serviceMgr) Init() { +} func (this *serviceMgr) UnInit() {