client.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package xhttp
  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. // Head HTTP request HEAD
  80. func Head(uri string, opt RequestOption) (msg Message, err error) {
  81. var res *http.Response
  82. if res, err = newRequest("HEAD", uri, nil, opt); err != nil {
  83. return
  84. }
  85. defer res.Body.Close()
  86. //msg, err = readBody(res)
  87. return
  88. }
  89. // GetJSON HTTP request GET, response JSON
  90. func GetJSON(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
  91. var res *http.Response
  92. if res, err = newRequest("GET", uri, nil, opt); err != nil {
  93. return
  94. }
  95. defer res.Body.Close()
  96. msg, err = readBody(res)
  97. if err != nil {
  98. return
  99. }
  100. err = msg.JSON(v)
  101. return
  102. }
  103. // GetXML HTTP request GET, response XML
  104. func GetXML(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
  105. var res *http.Response
  106. if res, err = newRequest("GET", uri, nil, opt); err != nil {
  107. return
  108. }
  109. defer res.Body.Close()
  110. msg, err = readBody(res)
  111. if err != nil {
  112. return
  113. }
  114. err = msg.XML(v)
  115. return
  116. }
  117. // Post HTTP request POST
  118. func Post(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  119. var res *http.Response
  120. if res, err = newRequest("POST", uri, body, opt); err != nil {
  121. return
  122. }
  123. defer res.Body.Close()
  124. msg, err = readBody(res)
  125. return
  126. }
  127. // Put HTTP request PUT
  128. func Put(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  129. var res *http.Response
  130. if res, err = newRequest("PUT", uri, body, opt); err != nil {
  131. return
  132. }
  133. defer res.Body.Close()
  134. msg, err = readBody(res)
  135. return
  136. }
  137. // Delete HTTP request DELETE
  138. func Delete(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  139. var res *http.Response
  140. if res, err = newRequest("DELETE", uri, body, opt); err != nil {
  141. return
  142. }
  143. defer res.Body.Close()
  144. msg, err = readBody(res)
  145. return
  146. }
  147. // Connect HTTP request CONNECT
  148. func Connect(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  149. var res *http.Response
  150. if res, err = newRequest("CONNECT", uri, body, opt); err != nil {
  151. return
  152. }
  153. defer res.Body.Close()
  154. msg, err = readBody(res)
  155. return
  156. }
  157. // Options HTTP request OPTIONS
  158. func Options(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  159. var res *http.Response
  160. if res, err = newRequest("OPTIONS", uri, body, opt); err != nil {
  161. return
  162. }
  163. defer res.Body.Close()
  164. msg, err = readBody(res)
  165. return
  166. }
  167. // Trace HTTP request TRACE
  168. func Trace(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  169. var res *http.Response
  170. if res, err = newRequest("TRACE", uri, body, opt); err != nil {
  171. return
  172. }
  173. defer res.Body.Close()
  174. msg, err = readBody(res)
  175. return
  176. }
  177. // Patch HTTP request PATCH
  178. func Patch(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  179. var res *http.Response
  180. if res, err = newRequest("PATCH", uri, body, opt); err != nil {
  181. return
  182. }
  183. defer res.Body.Close()
  184. msg, err = readBody(res)
  185. return
  186. }