鸣镝 9 роки тому
батько
коміт
2d8f8e7712
5 змінених файлів з 60 додано та 51 видалено
  1. 11 2
      oss/client.go
  2. 6 2
      oss/client_test.go
  3. 41 45
      oss/conn.go
  4. 1 1
      oss/conn_test.go
  5. 1 1
      oss/const.go

+ 11 - 2
oss/client.go

@@ -38,25 +38,34 @@ type (
 // error  操作无错误时为nil,非nil时表示操作出错。
 //
 func New(endpoint, accessKeyID, accessKeySecret string, options ...ClientOption) (*Client, error) {
+	// configuration
 	config := getDefaultOssConfig()
 	config.Endpoint = endpoint
 	config.AccessKeyID = accessKeyID
 	config.AccessKeySecret = accessKeySecret
 
+	// url parse
 	url := &urlMaker{}
 	url.Init(config.Endpoint, config.IsCname, config.IsUseProxy)
-	conn := &Conn{config, url}
 
+	// http connect
+	conn := &Conn{config: config, url: url}
+
+	// oss client
 	client := &Client{
 		config,
 		conn,
 	}
 
+	// client options parse
 	for _, option := range options {
 		option(client)
 	}
 
-	return client, nil
+	// create http connect
+	err := conn.init(config, url)
+
+	return client, err
 }
 
 //

+ 6 - 2
oss/client_test.go

@@ -1331,8 +1331,8 @@ func (s *OssClientSuite) TestClientOption(c *C) {
 	c.Assert(client.Conn.config.UserAgent, Equals, "go sdk user agent")
 }
 
-// _TestProxy
-func (s *OssClientSuite) _TestProxy(c *C) {
+// TestProxy
+func (s *OssClientSuite) TestProxy(c *C) {
 	bucketNameTest := bucketNamePrefix + "tp"
 	objectName := "体育/奥运/首金"
 	objectValue := "大江东去,浪淘尽,千古风流人物。 故垒西边,人道是、三国周郎赤壁。"
@@ -1357,6 +1357,10 @@ func (s *OssClientSuite) _TestProxy(c *C) {
 	_, err = bucket.GetObject(objectName)
 	c.Assert(err, IsNil)
 
+	// List Objects
+	_, err = bucket.ListObjects()
+	c.Assert(err, IsNil)
+
 	// Delete Object
 	err = bucket.DeleteObject(objectName)
 	c.Assert(err, IsNil)

+ 41 - 45
oss/conn.go

@@ -22,6 +22,40 @@ import (
 type Conn struct {
 	config *Config
 	url    *urlMaker
+	client *http.Client
+}
+
+// init 初始化Conn
+func (conn *Conn) init(config *Config, urlMaker *urlMaker) error {
+	httpTimeOut := conn.config.HTTPTimeout
+
+	// new Transport
+	transport := &http.Transport{
+		Dial: func(netw, addr string) (net.Conn, error) {
+			conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
+			if err != nil {
+				return nil, err
+			}
+			return newTimeoutConn(conn, httpTimeOut.ReadWriteTimeout, httpTimeOut.LongTimeout), nil
+		},
+		ResponseHeaderTimeout: httpTimeOut.HeaderTimeout,
+		MaxIdleConnsPerHost:   2000,
+	}
+
+	// Proxy
+	if conn.config.IsUseProxy {
+		proxyURL, err := url.Parse(config.ProxyHost)
+		if err != nil {
+			return err
+		}
+		transport.Proxy = http.ProxyURL(proxyURL)
+	}
+
+	conn.config = config
+	conn.url = urlMaker
+	conn.client = &http.Client{Transport: transport}
+
+	return nil
 }
 
 // Do 处理请求,返回响应结果。
@@ -34,7 +68,6 @@ func (conn Conn) Do(method, bucketName, objectName, urlParams, subResource strin
 
 func (conn Conn) doRequest(method string, uri *url.URL, canonicalizedResource string,
 	headers map[string]string, data io.Reader, initCRC uint64) (*Response, error) {
-	httpTimeOut := conn.config.HTTPTimeout
 	method = strings.ToUpper(method)
 	if !conn.config.IsUseProxy {
 		uri.Opaque = uri.Path
@@ -57,6 +90,12 @@ func (conn Conn) doRequest(method string, uri *url.URL, canonicalizedResource st
 		}()
 	}
 
+	if conn.config.IsAuthProxy {
+		auth := conn.config.ProxyUser + ":" + conn.config.ProxyPassword
+		basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
+		req.Header.Set("Proxy-Authorization", basic)
+	}
+
 	date := time.Now().UTC().Format(http.TimeFormat)
 	req.Header.Set(HTTPHeaderDate, date)
 	req.Header.Set(HTTPHeaderHost, conn.config.Endpoint)
@@ -73,50 +112,7 @@ func (conn Conn) doRequest(method string, uri *url.URL, canonicalizedResource st
 
 	conn.signHeader(req, canonicalizedResource)
 
-	var transport *http.Transport
-	if conn.config.IsUseProxy {
-		// proxy
-		proxyURL, err := url.Parse(conn.config.ProxyHost)
-		if err != nil {
-			return nil, err
-		}
-
-		transport = &http.Transport{
-			Proxy: http.ProxyURL(proxyURL),
-			Dial: func(netw, addr string) (net.Conn, error) {
-				conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
-				if err != nil {
-					return nil, err
-				}
-				return newTimeoutConn(conn, httpTimeOut.ReadWriteTimeout, httpTimeOut.LongTimeout), nil
-			},
-			ResponseHeaderTimeout: httpTimeOut.HeaderTimeout,
-			MaxIdleConnsPerHost:   2000,
-		}
-
-		if conn.config.IsAuthProxy {
-			auth := conn.config.ProxyUser + ":" + conn.config.ProxyPassword
-			basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
-			req.Header.Set("Proxy-Authorization", basic)
-		}
-	} else {
-		// no proxy
-		transport = &http.Transport{
-			Dial: func(netw, addr string) (net.Conn, error) {
-				conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
-				if err != nil {
-					return nil, err
-				}
-				return newTimeoutConn(conn, httpTimeOut.ReadWriteTimeout, httpTimeOut.LongTimeout), nil
-			},
-			ResponseHeaderTimeout: httpTimeOut.HeaderTimeout,
-			MaxIdleConnsPerHost:   2000,
-		}
-	}
-
-	timeoutClient := &http.Client{Transport: transport}
-
-	resp, err := timeoutClient.Do(req)
+	resp, err := conn.client.Do(req)
 	if err != nil {
 		return nil, err
 	}

+ 1 - 1
oss/conn_test.go

@@ -72,7 +72,7 @@ func (s *OssConnSuite) TestAuth(c *C) {
 	cfg := getDefaultOssConfig()
 	um := urlMaker{}
 	um.Init(endpoint, false, false)
-	conn := Conn{cfg, &um}
+	conn := Conn{cfg, &um, nil}
 	uri := um.getURL("bucket", "object", "")
 	req := &http.Request{
 		Method:     "PUT",

+ 1 - 1
oss/const.go

@@ -85,5 +85,5 @@ const (
 
 	CheckpointFileSuffix = ".cp" // Checkpoint文件后缀
 
-	Version = "1.2.2" // Go sdk版本
+	Version = "1.2.3" // Go sdk版本
 )