client.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package httpclient
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "git.nspix.com/golang/micro/helper/random"
  7. "io"
  8. "net"
  9. "net/http"
  10. "strings"
  11. "time"
  12. )
  13. var (
  14. httpClient = http.Client{
  15. Timeout: time.Second * 15,
  16. Transport: &http.Transport{
  17. Proxy: http.ProxyFromEnvironment,
  18. DialContext: (&net.Dialer{
  19. Timeout: 30 * time.Second,
  20. KeepAlive: 30 * time.Second,
  21. }).DialContext,
  22. ForceAttemptHTTP2: false,
  23. MaxIdleConns: 10,
  24. IdleConnTimeout: 30 * time.Second,
  25. TLSHandshakeTimeout: 10 * time.Second,
  26. ExpectContinueTimeout: 1 * time.Second,
  27. },
  28. }
  29. )
  30. func Get(ctx context.Context, url string, header map[string]string) (res *http.Response, err error) {
  31. var (
  32. req *http.Request
  33. )
  34. if req, err = http.NewRequest("GET", url, nil); err != nil {
  35. return
  36. }
  37. if header != nil {
  38. for k, v := range header {
  39. req.Header.Set(k, v)
  40. }
  41. }
  42. return MockDo(ctx, req)
  43. }
  44. func Post(ctx context.Context, url string, header map[string]string, data interface{}) (res *http.Response, err error) {
  45. var (
  46. req *http.Request
  47. contentType string
  48. reader io.Reader
  49. )
  50. switch v := data.(type) {
  51. case string:
  52. reader = strings.NewReader(v)
  53. contentType = "x-www-form-urlencoded"
  54. case []byte:
  55. reader = bytes.NewReader(v)
  56. contentType = ""
  57. default:
  58. var b []byte
  59. if b, err = json.Marshal(v); err == nil {
  60. reader = bytes.NewReader(b)
  61. contentType = "application/json"
  62. } else {
  63. return
  64. }
  65. }
  66. if req, err = http.NewRequest("POST", url, reader); err != nil {
  67. return
  68. }
  69. if contentType != "" {
  70. req.Header.Set("Content-Type", contentType)
  71. }
  72. if header != nil {
  73. for k, v := range header {
  74. req.Header.Set(k, v)
  75. }
  76. }
  77. return MockDo(ctx, req)
  78. }
  79. func MockDo(ctx context.Context, req *http.Request) (res *http.Response, err error) {
  80. randomIp := random.IP()
  81. req.Header.Set("X-Forwarded-For", randomIp)
  82. req.Header.Set("X-Real-IP", randomIp)
  83. req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
  84. if ctx != nil {
  85. req = req.WithContext(ctx)
  86. }
  87. return Do(ctx, req)
  88. }
  89. func Do(ctx context.Context, req *http.Request) (res *http.Response, err error) {
  90. if ctx != nil {
  91. req = req.WithContext(ctx)
  92. }
  93. return httpClient.Do(req)
  94. }