diff --git a/proxy/forward.go b/proxy/forward.go index af2334d..ce4cd51 100644 --- a/proxy/forward.go +++ b/proxy/forward.go @@ -74,18 +74,53 @@ func Forward(rw http.ResponseWriter, req *http.Request, serverConfig *Server) { rw.Header().Set(k, v) } + defer res.Body.Close() + // 重写响应数据 if !strings.Contains(strings.ToLower(res.Header.Get("Content-Type")), "application/json") || nil == serverConfig.RewriteResponseData || len(serverConfig.RewriteResponseData) == 0 { - io.Copy(rw, res.Body) - } else { - var responseData []byte - var gzipData io.Reader - gzipData, err = gzip.NewReader(res.Body) - responseData, err = ioutil.ReadAll(gzipData) - fmt.Println(string(responseData), err) - - bytesBuffer := bytes.NewReader([]byte(`{"data":{"permission":true}}`)) - io.Copy(rw, bytesBuffer) + _, _ = io.Copy(rw, res.Body) + return } - res.Body.Close() + var ( + responseData []byte + ) + + responseData, err = getResponseData(res) + fmt.Println(string(responseData), err) + + bytesBuffer := bytes.NewReader([]byte(`{"data":{"permission":true}}`)) + _, _ = io.Copy(rw, bytesBuffer) +} + +// getResultCompressType 获取返回结果的压缩方式 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 9:11 下午 2021/9/11 +func getResultCompressType(res *http.Response) string { + return strings.ToLower(res.Header.Get("Content-Encoding")) +} + +// getResponseData 解析响应数据 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 9:15 下午 2021/9/11 +func getResponseData(res *http.Response) ([]byte, error) { + var ( + responseData []byte + err error + ) + switch getResultCompressType(res) { + case "gzip": + var gzipData io.Reader + if gzipData, err = gzip.NewReader(res.Body); nil == err { + // gzip 处理过的数据 + responseData, err = ioutil.ReadAll(gzipData) + } + default: + // 默认没有任何压缩 + responseData, err = io.ReadAll(res.Body) + } + return responseData, err }