Преглед изворни кода

support http request redirect enabled or not

taowei.wtw пре 5 година
родитељ
комит
223659d3f6
4 измењених фајлова са 65 додато и 1 уклоњено
  1. 7 0
      oss/client.go
  2. 51 0
      oss/client_test.go
  3. 2 1
      oss/conf.go
  4. 5 0
      oss/conn.go

+ 7 - 0
oss/client.go

@@ -1542,6 +1542,13 @@ func AdditionalHeaders(headers []string) ClientOption {
 	}
 }
 
+// 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) {

+ 51 - 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,53 @@ func (s *OssClientSuite) TestClientOptionHeader(c *C) {
 
 	ForceDeleteBucket(client, bucketName, c)
 }
+
+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) {
+	// 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()
+
+	svr.Shutdown(nil)
+}

+ 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                //  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
 }

+ 5 - 0
oss/conn.go

@@ -68,6 +68,11 @@ func (conn *Conn) init(config *Config, urlMaker *urlMaker, client *http.Client)
 			transport.Proxy = http.ProxyURL(proxyURL)
 		}
 		client = &http.Client{Transport: transport}
+		if !config.RedirectEnabled {
+			client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
+				return http.ErrUseLastResponse
+			}
+		}
 	}
 
 	conn.config = config