aozhiwei 7f38d722b4 1
2024-07-24 18:51:46 +08:00

113 lines
2.7 KiB
Go

package middleware
import (
"f5"
"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) {
accountId := c.DefaultQuery("account_id", "")
sessionId := c.DefaultQuery("session_id", "")
if !jccommon.IsValidSessionId(accountId, sessionId) {
f5.RspErr(c, 500, "invalid session_id")
c.Abort()
service.SApiForward.IncInvalidSessionTimes()
return
}
cLock := service.SApiForward.AcquireLock(accountId)
defer service.SApiForward.ReleaseLock(cLock)
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": {
service.SApiForward.IncGetTimes()
httpRequest, createErr = http.NewRequest("GET", newUrl, nil)
if !f5.IsOnlineEnv() {
f5.GetSysLog().Info("CaForward method:%s newUrl:%s ", c.Request.Method, newUrl)
}
}
case "POST": {
service.SApiForward.IncPostTimes()
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 {
service.SApiForward.IncCreateErrTimes()
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 {
service.SApiForward.IncOkTimes()
c.String(200, string(bytes))
c.Abort()
return
} else {
service.SApiForward.IncReadRspErrTimes()
f5.RspErr(c, 500, "read response error")
c.Abort()
f5.GetSysLog().Info("CaForward read response url:%s eror:%s", newUrl, err)
return
}
} else {
service.SApiForward.IncDoErrTimes()
f5.RspErr(c, 500, "client.Do error")
c.Abort()
f5.GetSysLog().Info("CaForward client.Do url:%s error:%s", newUrl, err)
return
}
}