增加了自定义 CA 证书文件
diff --git a/webservice.go b/webservice.go
index 5e9183a..8dca00a 100644
--- a/webservice.go
+++ b/webservice.go
@@ -17,10 +17,17 @@
 	"sync"
 	"time"
 
+	"crypto/x509"
+
 	log "github.com/Sirupsen/logrus"
 	"github.com/franela/goreq"
 )
 
+var (
+	// ErrBadCAPEM 错误的 CA 文件
+	ErrBadCAPEM = errors.New("不正确的PEM文件")
+)
+
 // WebSession web session object
 type WebSession struct {
 	// AppId app id
@@ -109,10 +116,7 @@
 }
 
 // DoGet send GET request
-func (w *WebSession) DoGet(uri string, params map[string]string) (*http.Response, error) {
-	transport := w.httpConnectionPool.Get().(*http.Transport)
-	defer w.httpConnectionPool.Put(transport)
-	client := &http.Client{Transport: transport, Timeout: time.Duration(3) * time.Second}
+func (w *WebSession) DoGet(uri string, params map[string]string) (*goreq.Response, error) {
 
 	fullURL := w.BaseURL + uri
 
@@ -124,8 +128,7 @@
 		}
 	}
 	fullURL = fullURL + "?" + vl.Encode()
-	//	fmt.Printf("%v\n", full_url)
-	return client.Get(fullURL)
+	return goreq.Request{Uri: fullURL, Method: "GET"}.Do()
 }
 
 // GetTimestamp get time stamp format 20160103133455
@@ -161,14 +164,14 @@
 			TLSClientConfig:     &tls.Config{InsecureSkipVerify: b},
 			TLSHandshakeTimeout: time.Duration(1) * time.Second,
 			Dial: func(network, addr string) (net.Conn, error) {
-				default_timeout := time.Duration(1) * time.Second
-				return net.DialTimeout(network, addr, default_timeout)
+				defaultTimeout := time.Duration(1) * time.Second
+				return net.DialTimeout(network, addr, defaultTimeout)
 			}}
 	} else if strings.HasPrefix(baseurl, "http://") {
 		transport = http.Transport{MaxIdleConnsPerHost: 0,
 			Dial: func(network, addr string) (net.Conn, error) {
-				default_timeout := time.Duration(1) * time.Second
-				return net.DialTimeout(network, addr, default_timeout)
+				defaultTimeout := time.Duration(1) * time.Second
+				return net.DialTimeout(network, addr, defaultTimeout)
 			}}
 	}
 	log.Debugf("创建新连接")
@@ -230,8 +233,22 @@
 		}}}
 }
 
+// NewSessionWithCA new session ca
+func NewSessionWithCA(appID, appSecret, termID, baseURL string,
+	timeout int, ca []byte) (*WebSession, error) {
+	certs := x509.NewCertPool()
+	if !certs.AppendCertsFromPEM(ca) {
+		return nil, ErrBadCAPEM
+	}
+	if transport, ok := goreq.DefaultTransport.(*http.Transport); ok {
+		transport.TLSClientConfig = &tls.Config{RootCAs: certs}
+	}
+
+	return NewSession(appID, appSecret, termID, baseURL, timeout, true), nil
+}
+
 func (w *WebSession) getAuthToken() (string, error) {
-	type FormJson struct {
+	type FormJSON struct {
 		AppID       string `json:"app_id"`
 		TermID      string `json:"term_id"`
 		AccessToken string `json:"access_token"`
@@ -244,7 +261,6 @@
 	r, err := w.DoGet(uri, params)
 
 	if err != nil {
-		//		log.Errorf("Status = %v, err = %v\n", r.StatusCode, err)
 		return "", err
 	}
 	if r.StatusCode != 200 {
@@ -254,7 +270,7 @@
 	body, err := ioutil.ReadAll(r.Body)
 	defer r.Body.Close()
 
-	s := &FormJson{}
+	s := &FormJSON{}
 	err = json.Unmarshal(body, &s)
 	if err != nil {
 		log.Errorf("json unmarshal err %v", err)
@@ -264,7 +280,7 @@
 }
 
 func (w *WebSession) getAppAccessKey(token string) error {
-	type FormJson struct {
+	type FormJSON struct {
 		AppID      string `json:"app_id"`
 		TermID     string `json:"term_id"`
 		SessionKey string `json:"session_key"`
@@ -291,12 +307,12 @@
 	}
 	if r.StatusCode != 200 {
 		log.Errorf(" errcode = %v\n", r.StatusCode)
-		return errors.New(fmt.Sprintf("code %v", r.StatusCode))
+		return fmt.Errorf("code %v", r.StatusCode)
 	}
 
 	body, err := ioutil.ReadAll(r.Body)
 
-	s := &FormJson{}
+	s := &FormJSON{}
 	err = json.Unmarshal(body, &s)
 	if err != nil {
 		log.Errorf("json unmarshal err %v", err)
@@ -322,7 +338,7 @@
 	}
 
 	if r.StatusCode != 200 {
-		return nil, errors.New(fmt.Sprintf("Request StatusCode:%v", r.StatusCode))
+		return nil, fmt.Errorf("Request StatusCode:%v", r.StatusCode)
 	}
 
 	body, err := ioutil.ReadAll(r.Body)
@@ -350,22 +366,22 @@
 		vl.Set(k, fmt.Sprintf("%v", v))
 	}
 
-	sign_data := ""
+	signData := ""
 	for _, k := range signField {
 		if v, ok := params[k]; ok {
-			sign_data += fmt.Sprintf("%v", v)
+			signData += fmt.Sprintf("%v", v)
 		}
 	}
-	sign_data += ts + w.sessionKey
+	signData += ts + w.sessionKey
 	vl.Set("sign_method", "HMAC")
-	log.Debugf("Sign: key[%v] data[%v]\n", w.sessionKey, sign_data)
-	vl.Set("sign", w.SignWithKey(w.AppSecret, sign_data))
+	log.Debugf("Sign: key[%v] data[%v]\n", w.sessionKey, signData)
+	vl.Set("sign", w.SignWithKey(w.AppSecret, signData))
 
-	full_url := w.BaseURL + path
-	log.Debugf("CallService: %v\n", full_url)
+	fullURL := w.BaseURL + path
+	log.Debugf("CallService: %v\n", fullURL)
 	var r *goreq.Response
 	r, err = goreq.Request{
-		Uri:         full_url,
+		Uri:         fullURL,
 		Accept:      "application/json",
 		ContentType: "application/x-www-form-urlencoded",
 		Method:      "POST",
@@ -377,7 +393,7 @@
 	}
 	if r.StatusCode != 200 {
 		log.Errorf("Request Error %v\n", r.StatusCode)
-		err = errors.New(fmt.Sprintf("Request Error, StatusCode : %v", r.StatusCode))
+		err = fmt.Errorf("Request Error, StatusCode : %v", r.StatusCode)
 		return
 	}
 	if r.Body != nil {