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

httpheader头部适应gzip

parent f78d2a6f
......@@ -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, "//") {
......
......@@ -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 {
......
......@@ -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`).
......
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