113 lines
2.7 KiB
Go
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
|
|
}
|
|
|
|
}
|