|
@@ -11,12 +11,19 @@ import (
|
|
|
)
|
|
|
|
|
|
|
|
|
-func readBody(res *http.Response) (msg Message, err error) {
|
|
|
+func readBody(req *http.Request, res *http.Response) (msg Message, err error) {
|
|
|
var (
|
|
|
body []byte
|
|
|
reader io.Reader
|
|
|
)
|
|
|
|
|
|
+ msg.StatusCode = res.StatusCode
|
|
|
+ msg.Header = res.Header
|
|
|
+
|
|
|
+ defer res.Body.Close()
|
|
|
+ msg.res = res
|
|
|
+ msg.req = req
|
|
|
+
|
|
|
encoding := res.Header.Get("Content-Encoding")
|
|
|
switch encoding {
|
|
|
case "gzip":
|
|
@@ -31,14 +38,12 @@ func readBody(res *http.Response) (msg Message, err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- msg.StatusCode = res.StatusCode
|
|
|
- msg.Header = res.Header
|
|
|
msg.Body = body
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
-func newRequest(method, uri string, body io.Reader, opt RequestOption) (res *http.Response, err error) {
|
|
|
+func newRequest(method, uri string, body io.Reader, opt RequestOption) (req *http.Request, res *http.Response, err error) {
|
|
|
t := &http.Transport{
|
|
|
Dial: func(netw, addr string) (net.Conn, error) {
|
|
|
conn, err := net.DialTimeout(netw, addr, opt.RequestTimeOut)
|
|
@@ -62,7 +67,7 @@ func newRequest(method, uri string, body io.Reader, opt RequestOption) (res *htt
|
|
|
t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
|
|
|
}
|
|
|
c := &http.Client{Transport: t}
|
|
|
- var req *http.Request
|
|
|
+
|
|
|
req, err = http.NewRequest(method, uri, body)
|
|
|
if err != nil {
|
|
|
return
|
|
@@ -72,43 +77,51 @@ func newRequest(method, uri string, body io.Reader, opt RequestOption) (res *htt
|
|
|
req.Header.Add(k, v)
|
|
|
}
|
|
|
|
|
|
+ if opt.Cookies != nil {
|
|
|
+ for _, c := range opt.Cookies {
|
|
|
+ req.AddCookie(c)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(opt.username) > 0 {
|
|
|
+ req.SetBasicAuth(opt.username, opt.password)
|
|
|
+ }
|
|
|
+
|
|
|
res, err = c.Do(req)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Get(uri string, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("GET", uri, nil, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("GET", uri, nil, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Head(uri string, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("HEAD", uri, nil, opt); err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- defer res.Body.Close()
|
|
|
-
|
|
|
+ msg.req, msg.res, err = newRequest("HEAD", uri, nil, opt)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func GetJSON(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("GET", uri, nil, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("GET", uri, nil, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+ msg, err = readBody(req, res)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
@@ -118,13 +131,15 @@ func GetJSON(v interface{}, uri string, opt RequestOption) (msg Message, err err
|
|
|
|
|
|
|
|
|
func GetXML(v interface{}, uri string, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("GET", uri, nil, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("GET", uri, nil, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+ msg, err = readBody(req, res)
|
|
|
if err != nil {
|
|
|
return
|
|
|
}
|
|
@@ -134,77 +149,98 @@ func GetXML(v interface{}, uri string, opt RequestOption) (msg Message, err erro
|
|
|
|
|
|
|
|
|
func Post(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("POST", uri, body, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("POST", uri, body, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Put(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("PUT", uri, body, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("PUT", uri, body, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Delete(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("DELETE", uri, body, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("DELETE", uri, body, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Connect(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("CONNECT", uri, body, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("CONNECT", uri, body, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Options(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("OPTIONS", uri, body, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("OPTIONS", uri, body, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Trace(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("TRACE", uri, body, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("TRACE", uri, body, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
|
|
|
func Patch(uri string, body io.Reader, opt RequestOption) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("PATCH", uri, body, opt); err != nil {
|
|
|
+ var (
|
|
|
+ res *http.Response
|
|
|
+ req *http.Request
|
|
|
+ )
|
|
|
+ if req, res, err = newRequest("PATCH", uri, body, opt); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+
|
|
|
+ msg, err = readBody(req, res)
|
|
|
return
|
|
|
}
|