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 {
