Parcourir la source

support http request redirect enabled or not

taowei.wtw il y a 5 ans
Parent
commit
c37246c40f
6 fichiers modifiés avec 108 ajouts et 1 suppressions
  1. 7 0
      oss/client.go
  2. 73 0
      oss/client_test.go
  3. 2 1
      oss/conf.go
  4. 3 0
      oss/conn.go
  5. 11 0
      oss/redirect_1_6.go
  6. 12 0
      oss/redirect_1_7.go

+ 7 - 0
oss/client.go

@@ -1542,6 +1542,13 @@ func AdditionalHeaders(headers []string) ClientOption {
 	}
 }
 
+// only effective from go1.7 onward,RedirectEnabled set http redirect enabled or not
+func RedirectEnabled(enabled bool) ClientOption {
+	return func(client *Client) {
+		client.Config.RedirectEnabled = enabled
+	}
+}
+
 // Private
 func (client Client) do(method, bucketName string, params map[string]interface{},
 	headers map[string]string, data io.Reader, options ...Option) (*Response, error) {

+ 73 - 0
oss/client_test.go

@@ -7,6 +7,7 @@ package oss
 import (
 	"encoding/json"
 	"encoding/xml"
+	"fmt"
 	"io/ioutil"
 	"log"
 	"math/rand"
@@ -3469,3 +3470,75 @@ func (s *OssClientSuite) TestClientOptionHeader(c *C) {
 
 	ForceDeleteBucket(client, bucketName, c)
 }
+
+// compare with go1.7
+func compareVersion(goVersion string) bool {
+	nowVersion := runtime.Version()
+	nowVersion = strings.Replace(nowVersion, "go", "", -1)
+	pSlice1 := strings.Split(goVersion, ".")
+	pSlice2 := strings.Split(nowVersion, ".")
+	for k, v := range pSlice2 {
+		n2, _ := strconv.Atoi(string(v))
+		n1, _ := strconv.Atoi(string(pSlice1[k]))
+		if n2 > n1 {
+			return true
+		}
+		if n2 < n1 {
+			return false
+		}
+	}
+	return true
+}
+
+func homeHandler(w http.ResponseWriter, r *http.Request) {
+	http.Redirect(w, r, "/redirectTo", http.StatusFound)
+}
+func targetHandler(w http.ResponseWriter, r *http.Request) {
+	fmt.Fprintf(w, "You have been redirected here!")
+}
+
+func (s *OssClientSuite) TestClientRedirect(c *C) {
+	// must go1.7.0 onward
+	if !compareVersion("1.7.0") {
+		return
+	}
+
+	// get port
+	rand.Seed(time.Now().Unix())
+	port := 10000 + rand.Intn(10000)
+
+	// start http server
+	httpAddr := fmt.Sprintf("127.0.0.1:%d", port)
+	mux := http.NewServeMux()
+	mux.HandleFunc("/redirectTo", targetHandler)
+	mux.HandleFunc("/", homeHandler)
+	svr := &http.Server{
+		Addr:           httpAddr,
+		ReadTimeout:    10 * time.Second,
+		WriteTimeout:   10 * time.Second,
+		MaxHeaderBytes: 1 << 20,
+		Handler:        mux,
+	}
+
+	go func() {
+		svr.ListenAndServe()
+	}()
+
+	url := "http://" + httpAddr
+
+	// create client 1,redirect disable
+	client1, err := New(endpoint, accessID, accessKey, RedirectEnabled(false))
+	resp, err := client1.Conn.client.Get(url)
+	c.Assert(err, IsNil)
+	c.Assert(resp.StatusCode, Equals, http.StatusFound)
+	resp.Body.Close()
+
+	// create client2, redirect enabled
+	client2, err := New(endpoint, accessID, accessKey, RedirectEnabled(true))
+	resp, err = client2.Conn.client.Get(url)
+	c.Assert(err, IsNil)
+	c.Assert(resp.StatusCode, Equals, 200)
+	data, err := ioutil.ReadAll(resp.Body)
+	c.Assert(string(data), Equals, "You have been redirected here!")
+	resp.Body.Close()
+}

+ 2 - 1
oss/conf.go

@@ -102,7 +102,7 @@ type Config struct {
 	UserSetUa           bool                // UserAgent is set by user or not
 	AuthVersion         AuthVersionType     //  v1 or v2 signature,default is v1
 	AdditionalHeaders   []string            //  special http headers needed to be sign
-	
+	RedirectEnabled     bool                //  only effective from go1.7 onward, enable http redirect or not
 }
 
 // LimitUploadSpeed uploadSpeed:KB/s, 0 is unlimited,default is 0
@@ -179,6 +179,7 @@ func getDefaultOssConfig() *Config {
 	config.CredentialsProvider = provider
 
 	config.AuthVersion = AuthV1
+	config.RedirectEnabled = true
 
 	return &config
 }

+ 3 - 0
oss/conn.go

@@ -68,6 +68,9 @@ func (conn *Conn) init(config *Config, urlMaker *urlMaker, client *http.Client)
 			transport.Proxy = http.ProxyURL(proxyURL)
 		}
 		client = &http.Client{Transport: transport}
+		if !config.RedirectEnabled {
+			disableHTTPRedirect(client)
+		}
 	}
 
 	conn.config = config

+ 11 - 0
oss/redirect_1_6.go

@@ -0,0 +1,11 @@
+// +build !go1.7
+
+package oss
+
+import "net/http"
+
+// http.ErrUseLastResponse only is defined go1.7 onward
+
+func disableHTTPRedirect(client *http.Client) {
+
+}

+ 12 - 0
oss/redirect_1_7.go

@@ -0,0 +1,12 @@
+// +build go1.7
+
+package oss
+
+import "net/http"
+
+// http.ErrUseLastResponse only is defined go1.7 onward
+func disableHTTPRedirect(client *http.Client) {
+	client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
+		return http.ErrUseLastResponse
+	}
+}