|
@@ -3,6 +3,7 @@ package util
|
|
|
import (
|
|
|
"compress/gzip"
|
|
|
"context"
|
|
|
+ "crypto/x509"
|
|
|
"encoding/json"
|
|
|
"encoding/xml"
|
|
|
"fmt"
|
|
@@ -15,6 +16,8 @@ import (
|
|
|
"os/signal"
|
|
|
"syscall"
|
|
|
"time"
|
|
|
+
|
|
|
+ "crypto/tls"
|
|
|
)
|
|
|
|
|
|
const (
|
|
@@ -108,10 +111,10 @@ func ResponseJSON(reply *ReplyData, err error, req *http.Request, w http.Respons
|
|
|
// HTTPListenAndServe new server and start
|
|
|
func HTTPListenAndServe(addr string, router http.Handler) {
|
|
|
server := &http.Server{
|
|
|
- Addr: addr,
|
|
|
- Handler: router,
|
|
|
- //ReadTimeout: 30 * time.Second,
|
|
|
- //WriteTimeout: 30 * time.Second,
|
|
|
+ Addr: addr,
|
|
|
+ Handler: router,
|
|
|
+ ReadTimeout: 30 * time.Second,
|
|
|
+ WriteTimeout: 30 * time.Second,
|
|
|
MaxHeaderBytes: 1 << 20,
|
|
|
}
|
|
|
// Interrupt handler.
|
|
@@ -134,8 +137,8 @@ func HTTPListenAndServe(addr string, router http.Handler) {
|
|
|
log.Println("Exit", <-errc)
|
|
|
}
|
|
|
|
|
|
-func newRequest(method, uri string, header map[string]string, body io.Reader) (res *http.Response, err error) {
|
|
|
- client := &http.Client{Transport: &http.Transport{
|
|
|
+func newRequest(method, uri, certPath, keyPath string, header map[string]string, body io.Reader) (res *http.Response, err error) {
|
|
|
+ t := &http.Transport{
|
|
|
Dial: func(netw, addr string) (net.Conn, error) {
|
|
|
conn, err := net.DialTimeout(netw, addr, time.Second*RequestTimeOut)
|
|
|
if err != nil {
|
|
@@ -145,7 +148,18 @@ func newRequest(method, uri string, header map[string]string, body io.Reader) (r
|
|
|
return conn, nil
|
|
|
},
|
|
|
ResponseHeaderTimeout: time.Second * RequestTimeOut,
|
|
|
- }}
|
|
|
+ }
|
|
|
+
|
|
|
+ if certPath != "" {
|
|
|
+ cert, e := tls.LoadX509KeyPair(certPath, keyPath)
|
|
|
+ if e != nil {
|
|
|
+ t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
|
|
|
+ } else {
|
|
|
+ pool := x509.NewCertPool()
|
|
|
+ t.TLSClientConfig = &tls.Config{InsecureSkipVerify: true, Certificates: []tls.Certificate{cert}, RootCAs: pool}
|
|
|
+ }
|
|
|
+ }
|
|
|
+ client := &http.Client{Transport: t}
|
|
|
var (
|
|
|
req *http.Request
|
|
|
)
|
|
@@ -165,21 +179,14 @@ func newRequest(method, uri string, header map[string]string, body io.Reader) (r
|
|
|
}
|
|
|
|
|
|
res, err = client.Do(req)
|
|
|
-
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// Post HTTP request POST
|
|
|
-func Post(uri string, header map[string]string, data io.Reader) (msg Message, err error) {
|
|
|
- var res *http.Response
|
|
|
- if res, err = newRequest("POST", uri, header, data); err != nil {
|
|
|
- return
|
|
|
- }
|
|
|
+func readBody(res *http.Response) (msg Message, err error) {
|
|
|
var (
|
|
|
body []byte
|
|
|
reader io.Reader
|
|
|
)
|
|
|
- defer res.Body.Close()
|
|
|
encoding := res.Header.Get("Content-Encoding")
|
|
|
switch encoding {
|
|
|
case "gzip":
|
|
@@ -200,36 +207,26 @@ func Post(uri string, header map[string]string, data io.Reader) (msg Message, er
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// Get HTTP request GET
|
|
|
-func Get(uri string, header map[string]string) (msg Message, err error) {
|
|
|
+// Post HTTP request POST
|
|
|
+func Post(uri, certPath, keyPath string, header map[string]string, data io.Reader) (msg Message, err error) {
|
|
|
var res *http.Response
|
|
|
- if res, err = newRequest("GET", uri, header, nil); err != nil {
|
|
|
+ if res, err = newRequest("POST", uri, certPath, keyPath, header, data); err != nil {
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- var (
|
|
|
- body []byte
|
|
|
- reader io.Reader
|
|
|
- )
|
|
|
defer res.Body.Close()
|
|
|
- encoding := res.Header.Get("Content-Encoding")
|
|
|
- switch encoding {
|
|
|
- case "gzip":
|
|
|
- reader, err = gzip.NewReader(res.Body)
|
|
|
- if err == nil {
|
|
|
- body, err = ioutil.ReadAll(reader)
|
|
|
- }
|
|
|
- default:
|
|
|
- body, err = ioutil.ReadAll(res.Body)
|
|
|
- }
|
|
|
- if err != nil {
|
|
|
+ msg, err = readBody(res)
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// Get HTTP request GET
|
|
|
+func Get(uri, certPath, keyPath string, header map[string]string) (msg Message, err error) {
|
|
|
+ var res *http.Response
|
|
|
+ if res, err = newRequest("GET", uri, certPath, keyPath, header, nil); err != nil {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- msg.StatusCode = res.StatusCode
|
|
|
- msg.Header = res.Header
|
|
|
- msg.Body = body
|
|
|
-
|
|
|
+ defer res.Body.Close()
|
|
|
+ msg, err = readBody(res)
|
|
|
return
|
|
|
}
|
|
|
|