Pārlūkot izejas kodu

support set local host addr

taowei.wtw 6 gadi atpakaļ
vecāks
revīzija
d97da4e648
5 mainītis faili ar 56 papildinājumiem un 4 dzēšanām
  1. 9 2
      oss/client.go
  2. 35 0
      oss/client_test.go
  3. 2 0
      oss/conf.go
  4. 5 1
      oss/transport_1_6.go
  5. 5 1
      oss/transport_1_7.go

+ 9 - 2
oss/client.go

@@ -9,6 +9,7 @@ import (
 	"io"
 	"io"
 	"io/ioutil"
 	"io/ioutil"
 	"log"
 	"log"
+	"net"
 	"net/http"
 	"net/http"
 	"strings"
 	"strings"
 	"time"
 	"time"
@@ -1275,14 +1276,20 @@ func SetLogger(Logger *log.Logger) ClientOption {
 	}
 	}
 }
 }
 
 
-// SetAKInterface sets funciton for get the user's ak
-//
+// SetCredentialsProvider sets funciton for get the user's ak
 func SetCredentialsProvider(provider CredentialsProvider) ClientOption {
 func SetCredentialsProvider(provider CredentialsProvider) ClientOption {
 	return func(client *Client) {
 	return func(client *Client) {
 		client.Config.CredentialsProvider = provider
 		client.Config.CredentialsProvider = provider
 	}
 	}
 }
 }
 
 
+// SetLocalAddr sets funciton for local addr
+func SetLocalAddr(localAddr net.Addr) ClientOption {
+	return func(client *Client) {
+		client.Config.LocalAddr = localAddr
+	}
+}
+
 // Private
 // Private
 func (client Client) do(method, bucketName string, params map[string]interface{},
 func (client Client) do(method, bucketName string, params map[string]interface{},
 	headers map[string]string, data io.Reader, options ...Option) (*Response, error) {
 	headers map[string]string, data io.Reader, options ...Option) (*Response, error) {

+ 35 - 0
oss/client_test.go

@@ -9,6 +9,7 @@ import (
 	"io/ioutil"
 	"io/ioutil"
 	"log"
 	"log"
 	"math/rand"
 	"math/rand"
+	"net"
 	"net/http"
 	"net/http"
 	"os"
 	"os"
 	"reflect"
 	"reflect"
@@ -2789,3 +2790,37 @@ func (s *OssClientSuite) TestClientCredentialInfBuild(c *C) {
 	err = client.DeleteBucket(bucketNameTest)
 	err = client.DeleteBucket(bucketNameTest)
 	c.Assert(err, IsNil)
 	c.Assert(err, IsNil)
 }
 }
+
+func (s *OssClientSuite) TestClientSetLocalIpError(c *C) {
+	// create client and bucket
+	ipAddr, err := net.ResolveIPAddr("ip", "127.0.0.1")
+	c.Assert(err, IsNil)
+	localTCPAddr := &(net.TCPAddr{IP: ipAddr.IP})
+	client, err := New(endpoint, accessID, accessKey, SetLocalAddr(localTCPAddr))
+	c.Assert(err, IsNil)
+
+	var bucketNameTest = bucketNamePrefix + randLowStr(6)
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, NotNil)
+}
+
+func (s *OssClientSuite) TestClientSetLocalIpSuccess(c *C) {
+	//get local ip
+	conn, err := net.Dial("udp", "8.8.8.8:80")
+	c.Assert(err, IsNil)
+	localAddr := conn.LocalAddr().(*net.UDPAddr)
+	localIp := localAddr.IP.String()
+	conn.Close()
+
+	ipAddr, err := net.ResolveIPAddr("ip", localIp)
+	c.Assert(err, IsNil)
+	localTCPAddr := &(net.TCPAddr{IP: ipAddr.IP})
+	client, err := New(endpoint, accessID, accessKey, SetLocalAddr(localTCPAddr))
+	c.Assert(err, IsNil)
+
+	var bucketNameTest = bucketNamePrefix + randLowStr(6)
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+	err = client.DeleteBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+}

+ 2 - 0
oss/conf.go

@@ -4,6 +4,7 @@ import (
 	"bytes"
 	"bytes"
 	"fmt"
 	"fmt"
 	"log"
 	"log"
+	"net"
 	"os"
 	"os"
 	"time"
 	"time"
 )
 )
@@ -97,6 +98,7 @@ type Config struct {
 	UploadLimitSpeed    int                 // Upload limit speed:KB/s, 0 is unlimited
 	UploadLimitSpeed    int                 // Upload limit speed:KB/s, 0 is unlimited
 	UploadLimiter       *OssLimiter         // Bandwidth limit reader for upload
 	UploadLimiter       *OssLimiter         // Bandwidth limit reader for upload
 	CredentialsProvider CredentialsProvider // User provides interface to get AccessKeyID, AccessKeySecret, SecurityToken
 	CredentialsProvider CredentialsProvider // User provides interface to get AccessKeyID, AccessKeySecret, SecurityToken
+	LocalAddr           net.Addr            // local client host info
 }
 }
 
 
 // LimitUploadSpeed uploadSpeed:KB/s, 0 is unlimited,default is 0
 // LimitUploadSpeed uploadSpeed:KB/s, 0 is unlimited,default is 0

+ 5 - 1
oss/transport_1_6.go

@@ -13,7 +13,11 @@ func newTransport(conn *Conn, config *Config) *http.Transport {
 	// New Transport
 	// New Transport
 	transport := &http.Transport{
 	transport := &http.Transport{
 		Dial: func(netw, addr string) (net.Conn, error) {
 		Dial: func(netw, addr string) (net.Conn, error) {
-			conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
+			d := net.Dialer{Timeout: httpTimeOut.ConnectTimeout}
+			if config.LocalAddr != nil {
+				d.LocalAddr = config.LocalAddr
+			}
+			conn, err := d.Dial(netw, addr)
 			if err != nil {
 			if err != nil {
 				return nil, err
 				return nil, err
 			}
 			}

+ 5 - 1
oss/transport_1_7.go

@@ -13,7 +13,11 @@ func newTransport(conn *Conn, config *Config) *http.Transport {
 	// New Transport
 	// New Transport
 	transport := &http.Transport{
 	transport := &http.Transport{
 		Dial: func(netw, addr string) (net.Conn, error) {
 		Dial: func(netw, addr string) (net.Conn, error) {
-			conn, err := net.DialTimeout(netw, addr, httpTimeOut.ConnectTimeout)
+			d := net.Dialer{Timeout: httpTimeOut.ConnectTimeout}
+			if config.LocalAddr != nil {
+				d.LocalAddr = config.LocalAddr
+			}
+			conn, err := d.Dial(netw, addr)
 			if err != nil {
 			if err != nil {
 				return nil, err
 				return nil, err
 			}
 			}