client.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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(req *http.Request, res *http.Response) (msg Message, err error) {
  13. var (
  14. body []byte
  15. reader io.Reader
  16. )
  17. msg.StatusCode = res.StatusCode
  18. msg.Header = res.Header
  19. defer res.Body.Close()
  20. msg.res = res
  21. msg.req = req
  22. encoding := res.Header.Get("Content-Encoding")
  23. switch encoding {
  24. case "gzip":
  25. reader, err = gzip.NewReader(res.Body)
  26. if err == nil {
  27. body, err = io.ReadAll(reader)
  28. }
  29. default:
  30. body, err = io.ReadAll(res.Body)
  31. }
  32. if err != nil {
  33. return
  34. }
  35. msg.Body = body
  36. return
  37. }
  38. // newRequest new request
  39. func newRequest(method, uri string, body io.Reader, opt RequestOption) (req *http.Request, res *http.Response, err error) {
  40. t := &http.Transport{
  41. Dial: func(netw, addr string) (net.Conn, error) {
  42. conn, err := net.DialTimeout(netw, addr, opt.RequestTimeOut)
  43. if err != nil {
  44. return nil, err
  45. }
  46. conn.SetDeadline(time.Now().Add(opt.RequestTimeOut))
  47. return conn, nil
  48. },
  49. ResponseHeaderTimeout: time.Second * opt.ResponseHeaderTimeout,
  50. }
  51. if len(opt.CertFile) > 0 {
  52. cert, e := tls.LoadX509KeyPair(opt.CertFile, opt.KeyFile)
  53. if e != nil {
  54. t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
  55. } else {
  56. pool := x509.NewCertPool()
  57. t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true, Certificates: []tls.Certificate{cert}, RootCAs: pool}
  58. }
  59. } else {
  60. t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
  61. }
  62. c := &http.Client{Transport: t}
  63. //var req *http.Request
  64. req, err = http.NewRequest(method, uri, body)
  65. if err != nil {
  66. return
  67. }
  68. for k, v := range opt.Headers {
  69. req.Header.Add(k, v)
  70. }
  71. if opt.Cookies != nil {
  72. for _, c := range opt.Cookies {
  73. req.AddCookie(c)
  74. }
  75. }
  76. if len(opt.username) > 0 {
  77. req.SetBasicAuth(opt.username, opt.password)
  78. }
  79. res, err = c.Do(req)
  80. return
  81. }
  82. // Get HTTP request GET
  83. func Get(uri string, opt RequestOption) (msg Message, err error) {
  84. var (
  85. res *http.Response
  86. req *http.Request
  87. )
  88. if req, res, err = newRequest("GET", uri, nil, opt); err != nil {
  89. return
  90. }
  91. msg, err = readBody(req, res)
  92. return
  93. }
  94. // Head HTTP request HEAD
  95. func Head(uri string, opt RequestOption) (msg Message, err error) {
  96. msg.req, msg.res, err = newRequest("HEAD", uri, nil, opt)
  97. return
  98. }
  99. // GetJSON HTTP request GET, response JSON
  100. func GetJSON(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
  101. var (
  102. res *http.Response
  103. req *http.Request
  104. )
  105. if req, res, err = newRequest("GET", uri, nil, opt); err != nil {
  106. return
  107. }
  108. msg, err = readBody(req, res)
  109. if err != nil {
  110. return
  111. }
  112. err = msg.JSON(v)
  113. return
  114. }
  115. // GetXML HTTP request GET, response XML
  116. func GetXML(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
  117. var (
  118. res *http.Response
  119. req *http.Request
  120. )
  121. if req, res, err = newRequest("GET", uri, nil, opt); err != nil {
  122. return
  123. }
  124. msg, err = readBody(req, res)
  125. if err != nil {
  126. return
  127. }
  128. err = msg.XML(v)
  129. return
  130. }
  131. // Post HTTP request POST
  132. func Post(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  133. var (
  134. res *http.Response
  135. req *http.Request
  136. )
  137. if req, res, err = newRequest("POST", uri, body, opt); err != nil {
  138. return
  139. }
  140. msg, err = readBody(req, res)
  141. return
  142. }
  143. // Put HTTP request PUT
  144. func Put(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  145. var (
  146. res *http.Response
  147. req *http.Request
  148. )
  149. if req, res, err = newRequest("PUT", uri, body, opt); err != nil {
  150. return
  151. }
  152. msg, err = readBody(req, res)
  153. return
  154. }
  155. // Delete HTTP request DELETE
  156. func Delete(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  157. var (
  158. res *http.Response
  159. req *http.Request
  160. )
  161. if req, res, err = newRequest("DELETE", uri, body, opt); err != nil {
  162. return
  163. }
  164. msg, err = readBody(req, res)
  165. return
  166. }
  167. // Connect HTTP request CONNECT
  168. func Connect(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  169. var (
  170. res *http.Response
  171. req *http.Request
  172. )
  173. if req, res, err = newRequest("CONNECT", uri, body, opt); err != nil {
  174. return
  175. }
  176. msg, err = readBody(req, res)
  177. return
  178. }
  179. // Options HTTP request OPTIONS
  180. func Options(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  181. var (
  182. res *http.Response
  183. req *http.Request
  184. )
  185. if req, res, err = newRequest("OPTIONS", uri, body, opt); err != nil {
  186. return
  187. }
  188. msg, err = readBody(req, res)
  189. return
  190. }
  191. // Trace HTTP request TRACE
  192. func Trace(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  193. var (
  194. res *http.Response
  195. req *http.Request
  196. )
  197. if req, res, err = newRequest("TRACE", uri, body, opt); err != nil {
  198. return
  199. }
  200. msg, err = readBody(req, res)
  201. return
  202. }
  203. // Patch HTTP request PATCH
  204. func Patch(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
  205. var (
  206. res *http.Response
  207. req *http.Request
  208. )
  209. if req, res, err = newRequest("PATCH", uri, body, opt); err != nil {
  210. return
  211. }
  212. msg, err = readBody(req, res)
  213. return
  214. }