From d4e12126b19e23822af7fca86fddd535747860f8 Mon Sep 17 00:00:00 2001 From: zyd Date: Sun, 28 Jun 2020 17:13:05 +0800 Subject: [PATCH] =?UTF-8?q?httpheader=E5=A4=B4=E9=83=A8=E9=80=82=E5=BA=94g?= =?UTF-8?q?zip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/handler/proxyhandler.go | 72 +++++++++++++++++++++++++------------ src/model/response.go | 1 + src/service/field.go | 2 +- 3 files changed, 51 insertions(+), 24 deletions(-) diff --git a/src/handler/proxyhandler.go b/src/handler/proxyhandler.go index 7e7b7d2..b357b8d 100644 --- a/src/handler/proxyhandler.go +++ b/src/handler/proxyhandler.go @@ -2,7 +2,9 @@ package handler import ( "bytes" + "compress/gzip" "encoding/json" + "errors" "github.com/gin-gonic/gin" "github.com/vulcand/oxy/forward" "github.com/vulcand/oxy/testutils" @@ -14,7 +16,7 @@ import ( "strings" ) -var Resp *http.Response +//var Resp *http.Response func Proxy(c *gin.Context) { applyId := c.Param("applyId") @@ -31,16 +33,24 @@ func Proxy(c *gin.Context) { c.Error(err) return } + if proxyData.Second_level != 1 { + res := model.WebRes{} + res.ErrMsg = `服务申请未通过审批,请联系组织管理员或超管审批` + c.JSON(200, res) + return + } f, _ := forward.New(forward.PassHostHeader(true), forward.ResponseModifier(func(resp *http.Response) error { - Resp = resp + //Resp = resp //判断是否超过调用次数是否可以调用 callflag, sensitiveflag, err := service.QueryCallsCount(proxyData) if err != nil { - Return(err.Error()) + //Return(err.Error()) return nil } + //callflag = false if callflag == false { - Return(`调用达到当日限定次数`) + err = errors.New(`调用达到当日限定次数`) + Return(nil, err, resp) return nil } respbody, _ := ioutil.ReadAll(resp.Body) @@ -58,31 +68,37 @@ func Proxy(c *gin.Context) { //err = service.CallCounts(proxyData) err = service.CallCounts(proxyData) if err != nil { - Return(err.Error()) + Return(nil, err, resp) return nil } ////申请调用计次 err = service.ApplyCallCounts(proxyData) if err != nil { - Return(err.Error()) + Return(nil, err, resp) return nil } - Return(res) + Return(res, nil, resp) return nil })) - c.Request.URL = testutils.ParseURI(getProxyURL(proxyData.RealUrl, c.Request)) + c.Request.URL = testutils.ParseURI(getProxyURL(proxyData, c.Request)) c.Request.RequestURI = getRequestURI(c.Request) c.Request.Host = getHost(proxyData.RealUrl) f.ServeHTTP(c.Writer, c.Request) } -func getProxyURL(realPath string, req *http.Request) string { +func getProxyURL(proxyData model.ProxyData, req *http.Request) string { + realPath := proxyData.RealUrl rawQuery := req.URL.RawQuery var result = "" if rawQuery == "" { - result = realPath + "?f=json" + if proxyData.Name == "时空服务" { + result = realPath + "?f=json" + } } else { result = realPath + "?" + rawQuery + if proxyData.Name == "时空服务" && !strings.Contains(rawQuery, "f=json") { + result = result + "&f=json" + } } return result } @@ -99,26 +115,36 @@ func getRequestURI(req *http.Request) string { return result } -func Return(res interface{}) { - +func Return(res interface{}, err error, Resp *http.Response) { var b []byte + if err == nil { + switch res.(type) { + case []byte: + b = res.([]byte) + case interface{}: + b, _ = json.Marshal(res) - switch res.(type) { - case []byte: - b = res.([]byte) - case interface{}: - b, _ = json.Marshal(res) + } + } else { + if Resp.Header.Get("Content-Encoding") == "gzip" { + b = []byte(err.Error()) + b = gzipCompress(&b) + } } - Resp.Header.Set("X-Log-By", "Apaas") - - l := strconv.Itoa(len(b)) - - Resp.Header.Set("Content-Length", l) - + Resp.Header.Set("Content-Length", strconv.Itoa(len(b))) Resp.Body = ioutil.NopCloser(bytes.NewBuffer(b)) } +func gzipCompress(content *[]byte) []byte { + var compressData bytes.Buffer + gzipWriter := gzip.NewWriter(&compressData) + defer gzipWriter.Close() + gzipWriter.Write(*content) + gzipWriter.Flush() + return compressData.Bytes() +} + // 获取域名 func getHost(url string) (path string) { if strings.Contains(url, "//") { diff --git a/src/model/response.go b/src/model/response.go index b1c6160..468983e 100644 --- a/src/model/response.go +++ b/src/model/response.go @@ -11,6 +11,7 @@ type ProxyData struct { User_id string `json:"user_id" xorm:"user_id"` Data_service_type1 int `json:"data_service_type1" xorm:"data_service_type1"` Name string `json:"name"` + Second_level int `json:"second_level"xorm:"second_level"` } type WebRes struct { diff --git a/src/service/field.go b/src/service/field.go index 9753801..3d5f775 100644 --- a/src/service/field.go +++ b/src/service/field.go @@ -386,7 +386,7 @@ func GetRealPath(applyId string) (res model.ProxyData, err error) { } has, err := db. Select(`service_apply.res_fields as res_fields,service.req_url as req_url,service_request_spcs.count as count,service_safe_config.sensituve_word as sensituve_word -,service_request_spcs.sensitive_count as sensitive_count,service_apply.service_id as service_id,service_apply.id as apply_id,service_apply.user_id as user_id,service.data_service_type1,domains.name`). +,service_request_spcs.sensitive_count as sensitive_count,service_apply.service_id as service_id,service_apply.id as apply_id,service_apply.user_id as user_id,service.data_service_type1,domains.name,service_apply.second_level`). Table(`service`). Join(`inner`, `service_apply`, `service_apply.service_id = service.id`). Join(`left`, `service_request_spcs`, `service_request_spcs.id = service_apply.request_spcs_id`). -- 2.26.0