|
|
@@ -27,8 +27,18 @@ const (
|
|
|
RequestTimeOut = 30
|
|
|
)
|
|
|
|
|
|
+const (
|
|
|
+ // response header Content-Encoding
|
|
|
+ ResContentEncoding = `Content-Encoding`
|
|
|
+
|
|
|
+ // encoding gzip
|
|
|
+ EncodingGZIP = `gzip`
|
|
|
+)
|
|
|
+
|
|
|
var (
|
|
|
reqTimeOut = time.Duration(RequestTimeOut)
|
|
|
+
|
|
|
+ ErrStausCodeNotOk = errors.New(`StatusCode not 200`)
|
|
|
)
|
|
|
|
|
|
// GetRealIP get real IP from Request
|
|
|
@@ -44,17 +54,24 @@ func SetHTTPRequestTimeout(seconds int) {
|
|
|
reqTimeOut = time.Duration(seconds)
|
|
|
}
|
|
|
|
|
|
+// HTTPReqOption request option
|
|
|
+type HTTPReqOption struct {
|
|
|
+}
|
|
|
+
|
|
|
// HTTPMessage HTTP response
|
|
|
type HTTPMessage struct {
|
|
|
StatusCode int
|
|
|
Body []byte
|
|
|
Header http.Header
|
|
|
+
|
|
|
+ Req *http.Request
|
|
|
+ Res *http.Response
|
|
|
}
|
|
|
|
|
|
// JSON Body to JSON
|
|
|
func (m HTTPMessage) JSON(dest interface{}) (err error) {
|
|
|
if m.StatusCode != http.StatusOK {
|
|
|
- err = errors.New(`StatusCode not 200`)
|
|
|
+ err = ErrStausCodeNotOk
|
|
|
return
|
|
|
}
|
|
|
err = json.Unmarshal(m.Body, &dest)
|
|
|
@@ -64,7 +81,7 @@ func (m HTTPMessage) JSON(dest interface{}) (err error) {
|
|
|
// XML Body to XML
|
|
|
func (m HTTPMessage) XML(dest interface{}) (err error) {
|
|
|
if m.StatusCode != http.StatusOK {
|
|
|
- err = errors.New(`StatusCode not 200`)
|
|
|
+ err = ErrStausCodeNotOk
|
|
|
return
|
|
|
}
|
|
|
err = xml.Unmarshal(m.Body, &dest)
|
|
|
@@ -74,14 +91,14 @@ func (m HTTPMessage) XML(dest interface{}) (err error) {
|
|
|
// JSONQuery Body to JSONQuery
|
|
|
func (m HTTPMessage) JSONQuery() (jq *JSONQuery, err error) {
|
|
|
if m.StatusCode != http.StatusOK {
|
|
|
- err = errors.New(`StatusCode not 200`)
|
|
|
+ err = ErrStausCodeNotOk
|
|
|
return
|
|
|
}
|
|
|
jq, err = NewJSONQuery(m.Body)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func newRequest(method, uri, certPath, keyPath string, header map[string]string, body io.Reader) (res *http.Response, err error) {
|
|
|
+func newRequest(method, uri, certPath, keyPath string, header map[string]string, body io.Reader) (req *http.Request, res *http.Response, err error) {
|
|
|
t := &http.Transport{
|
|
|
Dial: func(netw, addr string) (net.Conn, error) {
|
|
|
var c net.Conn
|
|
|
@@ -107,7 +124,6 @@ func newRequest(method, uri, certPath, keyPath string, header map[string]string,
|
|
|
}
|
|
|
|
|
|
var (
|
|
|
- req *http.Request
|
|
|
client = &http.Client{Transport: t}
|
|
|
)
|
|
|
|
|
|
@@ -124,14 +140,14 @@ func newRequest(method, uri, certPath, keyPath string, header map[string]string,
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func readBody(res *http.Response) (msg HTTPMessage, err error) {
|
|
|
+func readBody(msg *HTTPMessage, res *http.Response) (err error) {
|
|
|
var (
|
|
|
body []byte
|
|
|
reader io.Reader
|
|
|
)
|
|
|
- encoding := res.Header.Get("Content-Encoding")
|
|
|
+ encoding := res.Header.Get(ResContentEncoding)
|
|
|
switch encoding {
|
|
|
- case "gzip":
|
|
|
+ case EncodingGZIP:
|
|
|
reader, err = gzip.NewReader(res.Body)
|
|
|
if err == nil {
|
|
|
body, err = io.ReadAll(reader)
|
|
|
@@ -151,23 +167,22 @@ func readBody(res *http.Response) (msg HTTPMessage, err error) {
|
|
|
|
|
|
// Post HTTP request POST
|
|
|
func Post(uri, certPath, keyPath string, header map[string]string, data io.Reader) (msg HTTPMessage, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("POST", uri, certPath, keyPath, header, data); err != nil {
|
|
|
+ if msg.Req, msg.Res, err = newRequest(http.MethodPost, uri, certPath, keyPath, header, data); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+ defer msg.Res.Body.Close()
|
|
|
+ err = readBody(&msg, msg.Res)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
// Get HTTP request GET
|
|
|
func Get(uri, certPath, keyPath string, header map[string]string) (msg HTTPMessage, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("GET", uri, certPath, keyPath, header, nil); err != nil {
|
|
|
+ //var res *http.Response
|
|
|
+ if msg.Req, msg.Res, err = newRequest(http.MethodGet, uri, certPath, keyPath, header, nil); err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- defer res.Body.Close()
|
|
|
- msg, err = readBody(res)
|
|
|
+ defer msg.Res.Body.Close()
|
|
|
+ err = readBody(&msg, msg.Res)
|
|
|
return
|
|
|
}
|