Commit d4e12126 authored by 张宇迪's avatar 张宇迪

httpheader头部适应gzip

parent f78d2a6f
...@@ -2,7 +2,9 @@ package handler ...@@ -2,7 +2,9 @@ package handler
import ( import (
"bytes" "bytes"
"compress/gzip"
"encoding/json" "encoding/json"
"errors"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/vulcand/oxy/forward" "github.com/vulcand/oxy/forward"
"github.com/vulcand/oxy/testutils" "github.com/vulcand/oxy/testutils"
...@@ -14,7 +16,7 @@ import ( ...@@ -14,7 +16,7 @@ import (
"strings" "strings"
) )
var Resp *http.Response //var Resp *http.Response
func Proxy(c *gin.Context) { func Proxy(c *gin.Context) {
applyId := c.Param("applyId") applyId := c.Param("applyId")
...@@ -31,16 +33,24 @@ func Proxy(c *gin.Context) { ...@@ -31,16 +33,24 @@ func Proxy(c *gin.Context) {
c.Error(err) c.Error(err)
return 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 { f, _ := forward.New(forward.PassHostHeader(true), forward.ResponseModifier(func(resp *http.Response) error {
Resp = resp //Resp = resp
//判断是否超过调用次数是否可以调用 //判断是否超过调用次数是否可以调用
callflag, sensitiveflag, err := service.QueryCallsCount(proxyData) callflag, sensitiveflag, err := service.QueryCallsCount(proxyData)
if err != nil { if err != nil {
Return(err.Error()) //Return(err.Error())
return nil return nil
} }
//callflag = false
if callflag == false { if callflag == false {
Return(`调用达到当日限定次数`) err = errors.New(`调用达到当日限定次数`)
Return(nil, err, resp)
return nil return nil
} }
respbody, _ := ioutil.ReadAll(resp.Body) respbody, _ := ioutil.ReadAll(resp.Body)
...@@ -58,31 +68,37 @@ func Proxy(c *gin.Context) { ...@@ -58,31 +68,37 @@ func Proxy(c *gin.Context) {
//err = service.CallCounts(proxyData) //err = service.CallCounts(proxyData)
err = service.CallCounts(proxyData) err = service.CallCounts(proxyData)
if err != nil { if err != nil {
Return(err.Error()) Return(nil, err, resp)
return nil return nil
} }
////申请调用计次 ////申请调用计次
err = service.ApplyCallCounts(proxyData) err = service.ApplyCallCounts(proxyData)
if err != nil { if err != nil {
Return(err.Error()) Return(nil, err, resp)
return nil return nil
} }
Return(res) Return(res, nil, resp)
return nil 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.RequestURI = getRequestURI(c.Request)
c.Request.Host = getHost(proxyData.RealUrl) c.Request.Host = getHost(proxyData.RealUrl)
f.ServeHTTP(c.Writer, c.Request) 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 rawQuery := req.URL.RawQuery
var result = "" var result = ""
if rawQuery == "" { if rawQuery == "" {
if proxyData.Name == "时空服务" {
result = realPath + "?f=json" result = realPath + "?f=json"
}
} else { } else {
result = realPath + "?" + rawQuery result = realPath + "?" + rawQuery
if proxyData.Name == "时空服务" && !strings.Contains(rawQuery, "f=json") {
result = result + "&f=json"
}
} }
return result return result
} }
...@@ -99,26 +115,36 @@ func getRequestURI(req *http.Request) string { ...@@ -99,26 +115,36 @@ func getRequestURI(req *http.Request) string {
return result return result
} }
func Return(res interface{}) { func Return(res interface{}, err error, Resp *http.Response) {
var b []byte var b []byte
if err == nil {
switch res.(type) { switch res.(type) {
case []byte: case []byte:
b = res.([]byte) b = res.([]byte)
case interface{}: case interface{}:
b, _ = json.Marshal(res) 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") Resp.Header.Set("X-Log-By", "Apaas")
Resp.Header.Set("Content-Length", strconv.Itoa(len(b)))
l := strconv.Itoa(len(b))
Resp.Header.Set("Content-Length", l)
Resp.Body = ioutil.NopCloser(bytes.NewBuffer(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) { func getHost(url string) (path string) {
if strings.Contains(url, "//") { if strings.Contains(url, "//") {
......
...@@ -11,6 +11,7 @@ type ProxyData struct { ...@@ -11,6 +11,7 @@ type ProxyData struct {
User_id string `json:"user_id" xorm:"user_id"` User_id string `json:"user_id" xorm:"user_id"`
Data_service_type1 int `json:"data_service_type1" xorm:"data_service_type1"` Data_service_type1 int `json:"data_service_type1" xorm:"data_service_type1"`
Name string `json:"name"` Name string `json:"name"`
Second_level int `json:"second_level"xorm:"second_level"`
} }
type WebRes struct { type WebRes struct {
......
...@@ -386,7 +386,7 @@ func GetRealPath(applyId string) (res model.ProxyData, err error) { ...@@ -386,7 +386,7 @@ func GetRealPath(applyId string) (res model.ProxyData, err error) {
} }
has, err := db. 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 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`). Table(`service`).
Join(`inner`, `service_apply`, `service_apply.service_id = service.id`). Join(`inner`, `service_apply`, `service_apply.service_id = service.id`).
Join(`left`, `service_request_spcs`, `service_request_spcs.id = service_apply.request_spcs_id`). Join(`left`, `service_request_spcs`, `service_request_spcs.id = service_apply.request_spcs_id`).
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment