client.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package http
  2. import (
  3. "compress/gzip"
  4. "crypto/tls"
  5. "crypto/x509"
  6. "io"
  7. "net"
  8. "net/http"
  9. "time"
  10. )
  11. // readBody read response
  12. func readBody(res *http.Response) (msg Message, err error) {
  13. var (
  14. body []byte
  15. reader io.Reader
  16. )
  17. encoding := res.Header.Get("Content-Encoding")
  18. switch encoding {
  19. case "gzip":
  20. reader, err = gzip.NewReader(res.Body)
  21. if err == nil {
  22. body, err = io.ReadAll(reader)
  23. }
  24. default:
  25. body, err = io.ReadAll(res.Body)
  26. }
  27. if err != nil {
  28. return
  29. }
  30. msg.StatusCode = res.StatusCode
  31. msg.Header = res.Header
  32. msg.Body = body
  33. return
  34. }
  35. // newRequest new request
  36. func newRequest(method, uri string, body io.Reader, opt RequestOption) (res *http.Response, err error) {
  37. t := &http.Transport{
  38. Dial: func(netw, addr string) (net.Conn, error) {
  39. conn, err := net.DialTimeout(netw, addr, opt.RequestTimeOut)
  40. if err != nil {
  41. return nil, err
  42. }
  43. conn.SetDeadline(time.Now().Add(opt.RequestTimeOut))
  44. return conn, nil
  45. },
  46. ResponseHeaderTimeout: time.Second * opt.ResponseHeaderTimeout,
  47. }
  48. if len(opt.CertFile) > 0 {
  49. cert, e := tls.LoadX509KeyPair(opt.CertFile, opt.KeyFile)
  50. if e != nil {
  51. t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
  52. } else {
  53. pool := x509.NewCertPool()
  54. t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true, Certificates: []tls.Certificate{cert}, RootCAs: pool}
  55. }
  56. }
  57. c := &http.Client{Transport: t}
  58. var req *http.Request
  59. req, err = http.NewRequest(method, uri, body)
  60. if err != nil {
  61. return
  62. }
  63. for k, v := range opt.Headers {
  64. req.Header.Add(k, v)
  65. }
  66. res, err = c.Do(req)
  67. return
  68. }
  69. // Get HTTP request GET
  70. func Get(uri string, opt RequestOption) (msg Message, err error) {
  71. var res *http.Response
  72. if res, err = newRequest("GET", uri, nil, opt); err != nil {
  73. return
  74. }
  75. defer res.Body.Close()
  76. msg, err = readBody(res)
  77. return
  78. }
  79. // GetJSON HTTP request GET, response JSON
  80. func GetJSON(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
  81. var res *http.Response
  82. if res, err = newRequest("GET", uri, nil, opt); err != nil {
  83. return
  84. }
  85. defer res.Body.Close()
  86. msg, err = readBody(res)
  87. if err != nil {
  88. return
  89. }
  90. err = msg.JSON(v)
  91. return
  92. }
  93. // GetXML HTTP request GET, response XML
  94. func GetXML(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
  95. var res *http.Response
  96. if res, err = newRequest("GET", uri, nil, opt); err != nil {
  97. return
  98. }
  99. defer res.Body.Close()
  100. msg, err = readBody(res)
  101. if err != nil {
  102. return
  103. }
  104. err = msg.XML(v)
  105. return
  106. }
  107. // Post HTTP request POST
  108. func Post(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  109. var res *http.Response
  110. if res, err = newRequest("POST", uri, body, opt); err != nil {
  111. return
  112. }
  113. defer res.Body.Close()
  114. msg, err = readBody(res)
  115. return
  116. }