http.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package util
  2. import (
  3. log "app.yhyue.com/moapp/jylog"
  4. "bufio"
  5. "bytes"
  6. "compress/flate"
  7. "compress/gzip"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/gogf/gf/v2/frame/g"
  11. "github.com/gogf/gf/v2/net/ghttp"
  12. "io"
  13. "net/http"
  14. "net/url"
  15. "strings"
  16. )
  17. func CopyReqAndFormData(req *http.Request, copy ...bool) {
  18. //获取请求体内容
  19. bodyBytes, _ := io.ReadAll(req.Body)
  20. _ = req.Body.Close()
  21. //将请求体内容重新写入请求体
  22. req.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
  23. if strings.Index(req.Header.Get("Content-Type"), "json") > -1 {
  24. _ = ParseJson(req)
  25. } else {
  26. _ = req.ParseForm() //格式化请求内容
  27. }
  28. //将请求体内容重新写入请求体
  29. if len(copy) == 0 || copy[0] == false {
  30. req.Body = io.NopCloser(bytes.NewBuffer(bodyBytes))
  31. }
  32. }
  33. func ParseJson(req *http.Request) error {
  34. bytes, err := io.ReadAll(req.Body)
  35. if err != nil {
  36. return err
  37. }
  38. jsonMap := map[string]interface{}{}
  39. err = json.Unmarshal(bytes, &jsonMap)
  40. if err != nil {
  41. return err
  42. }
  43. req.Form = make(url.Values)
  44. for k, v := range jsonMap {
  45. req.Form.Set(k, fmt.Sprint(v))
  46. }
  47. return nil
  48. }
  49. // ChangeGResponse 修改相应内容
  50. // resp 相应体
  51. // fn 修改相应内容方法
  52. func ChangeGResponse(r *ghttp.Request, fn func([]byte) error) (err error) {
  53. encoding, content := r.Response.Header().Get("Content-Encoding"), []byte{}
  54. if encoding == "gzip" { //处理解压
  55. body, err := gzip.NewReader(r.Body)
  56. if err != nil {
  57. log.WithContext(r.Context()).Error(r.Context(), "ChangeResponse gzip err", err)
  58. return err
  59. }
  60. content, err = io.ReadAll(body)
  61. } else if encoding == "deflate" {
  62. content, err = io.ReadAll(flate.NewReader(r.Body))
  63. } else { //无设置压缩
  64. content, err = io.ReadAll(r.Body)
  65. }
  66. if err != nil {
  67. return err
  68. }
  69. // 修改相应内容
  70. err = fn(content)
  71. if err != nil {
  72. return err
  73. }
  74. var zBuf bytes.Buffer
  75. var outputWriter io.Writer
  76. if encoding == "gzip" || encoding == "deflate" { //压缩
  77. if encoding == "gzip" {
  78. outputWriter, _ = gzip.NewWriterLevel(&zBuf, gzip.BestSpeed)
  79. } else {
  80. outputWriter, _ = flate.NewWriter(&zBuf, flate.BestSpeed)
  81. }
  82. } else {
  83. outputWriter = bufio.NewWriter(&zBuf)
  84. r.Response.Header().Set("content-length", fmt.Sprint(len(content)))
  85. }
  86. if _, err = outputWriter.Write(content); err != nil {
  87. return err
  88. }
  89. switch outputWriter.(type) {
  90. case *gzip.Writer:
  91. err = outputWriter.(*gzip.Writer).Close()
  92. case *flate.Writer:
  93. err = outputWriter.(*flate.Writer).Close()
  94. case *bufio.Writer:
  95. err = outputWriter.(*bufio.Writer).Flush()
  96. }
  97. if err != nil {
  98. return err
  99. }
  100. _, err = fmt.Fprint(r.Response.ResponseWriter, zBuf.Bytes())
  101. return nil
  102. }
  103. func SingleJoiningSlash(a, b string) string {
  104. aslash := strings.HasSuffix(a, "/")
  105. bslash := strings.HasPrefix(b, "/")
  106. switch {
  107. case aslash && bslash:
  108. return a + b[1:]
  109. case !aslash && !bslash:
  110. return a + "/" + b
  111. }
  112. return a + b
  113. }
  114. func ChangeResponse(resp *http.Response, fn func([]byte) ([]byte, error)) (err error) {
  115. var (
  116. encoding = resp.Header.Get("Content-Encoding")
  117. content []byte
  118. ctx = resp.Request.Context()
  119. )
  120. if encoding == "gzip" { //处理解压
  121. body, err := gzip.NewReader(resp.Body)
  122. if err != nil {
  123. log.WithContext(ctx).Error(ctx, "ChangeResponse gzip err", err)
  124. return err
  125. }
  126. content, err = io.ReadAll(body)
  127. } else if encoding == "deflate" {
  128. content, err = io.ReadAll(flate.NewReader(resp.Body))
  129. } else { //无设置压缩
  130. content, err = io.ReadAll(resp.Body)
  131. }
  132. if err != nil {
  133. return err
  134. }
  135. // 修改相应内容
  136. var newContent []byte
  137. newContent, err = fn(content)
  138. if err != nil {
  139. g.Log().Errorf(ctx, "changeRes func err", err)
  140. return err
  141. }
  142. var zBuf bytes.Buffer
  143. var outputWriter io.Writer
  144. if encoding == "gzip" || encoding == "deflate" { //压缩
  145. if encoding == "gzip" {
  146. outputWriter, _ = gzip.NewWriterLevel(&zBuf, gzip.BestSpeed)
  147. } else {
  148. outputWriter, _ = flate.NewWriter(&zBuf, flate.BestSpeed)
  149. }
  150. } else {
  151. outputWriter = bufio.NewWriter(&zBuf)
  152. resp.Header.Set("content-length", fmt.Sprint(len(newContent)))
  153. }
  154. if _, err = outputWriter.Write(newContent); err != nil {
  155. return err
  156. }
  157. switch outputWriter.(type) {
  158. case *gzip.Writer:
  159. err = outputWriter.(*gzip.Writer).Close()
  160. case *flate.Writer:
  161. err = outputWriter.(*flate.Writer).Close()
  162. case *bufio.Writer:
  163. err = outputWriter.(*bufio.Writer).Flush()
  164. }
  165. if err != nil {
  166. return err
  167. }
  168. resp.Body = io.NopCloser(bytes.NewReader(zBuf.Bytes()))
  169. return nil
  170. }