github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/http_client/http_client_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package http_client 5 6 import ( 7 "context" 8 "io" 9 "net/http" 10 "net/http/httptest" 11 "net/url" 12 "strings" 13 "testing" 14 15 clientv1 "github.com/qiniu/go-sdk/v7/client" 16 "github.com/qiniu/go-sdk/v7/storagev2/credentials" 17 "github.com/qiniu/go-sdk/v7/storagev2/region" 18 ) 19 20 func TestHttpClient(t *testing.T) { 21 type Req struct { 22 id int 23 url *url.URL 24 } 25 reqs := make([]Req, 0, 3) 26 mux_1 := http.NewServeMux() 27 mux_1.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { 28 reqs = append(reqs, Req{id: 1, url: r.URL}) 29 if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") { 30 t.Fatalf("Unexpected authorization: %s", auth) 31 } 32 w.Header().Add("X-ReqId", "fakereqid") 33 w.WriteHeader(http.StatusInternalServerError) 34 io.WriteString(w, "test error") 35 }) 36 server_1 := httptest.NewServer(mux_1) 37 defer server_1.Close() 38 39 mux_2 := http.NewServeMux() 40 mux_2.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { 41 reqs = append(reqs, Req{id: 2, url: r.URL}) 42 if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") { 43 t.Fatalf("Unexpected authorization: %s", auth) 44 } 45 w.Header().Add("X-ReqId", "fakereqid") 46 w.WriteHeader(http.StatusInternalServerError) 47 io.WriteString(w, "test error") 48 }) 49 server_2 := httptest.NewServer(mux_2) 50 defer server_2.Close() 51 52 mux_3 := http.NewServeMux() 53 mux_3.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { 54 reqs = append(reqs, Req{id: 3, url: r.URL}) 55 if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") { 56 t.Fatalf("Unexpected authorization: %s", auth) 57 } 58 w.Header().Add("X-ReqId", "fakereqid") 59 w.WriteHeader(http.StatusInternalServerError) 60 io.WriteString(w, "test error") 61 }) 62 server_3 := httptest.NewServer(mux_3) 63 defer server_3.Close() 64 65 httpClient := NewClient(&Options{ 66 HostRetryConfig: &RetryConfig{}, 67 Regions: ®ion.Region{ 68 Api: region.Endpoints{ 69 Preferred: []string{server_1.URL, server_2.URL}, 70 Alternative: []string{server_3.URL}, 71 }, 72 }, 73 }) 74 _, err := httpClient.Do(context.Background(), &Request{ 75 ServiceNames: []region.ServiceName{region.ServiceApi}, 76 Method: http.MethodGet, 77 Path: "/test", 78 RawQuery: "fakeRawQuery", 79 Query: url.Values{ 80 "x-query-1": {"x-value-1"}, 81 "x-query-2": {"x-value-2"}, 82 }, 83 Header: http.Header{ 84 "x-qiniu-1": {"x-value-1"}, 85 "x-qiniu-2": {"x-value-2"}, 86 }, 87 Credentials: credentials.NewCredentials("TestAk", "TestSk"), 88 }) 89 if err == nil { 90 t.Fatalf("Expected error") 91 } 92 if clientErr, ok := err.(*clientv1.ErrorInfo); ok { 93 if clientErr.Code != http.StatusInternalServerError { 94 t.Fatalf("Unexpected status code: %d", clientErr.Code) 95 } 96 } 97 if len(reqs) != 12 { 98 t.Fatalf("Unexpected reqs: %#v", reqs) 99 } 100 for i, req := range reqs { 101 if i/4+1 != req.id || req.url.String() != "/test?fakeRawQuery&x-query-1=x-value-1&x-query-2=x-value-2" { 102 t.Fatalf("Unexpected req: %d, %d, %s", i, req.id, req.url) 103 } 104 } 105 } 106 107 func TestHttpClientJson(t *testing.T) { 108 mux_1 := http.NewServeMux() 109 mux_1.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { 110 if auth := r.Header.Get("Authorization"); !strings.HasPrefix(auth, "Qiniu TestAk:") { 111 t.Fatalf("Unexpected authorization: %s", auth) 112 } 113 w.Header().Add("X-ReqId", "fakereqid") 114 io.WriteString(w, "{\"Test\":\"AccessKey\"}") 115 }) 116 server_1 := httptest.NewServer(mux_1) 117 defer server_1.Close() 118 119 httpClient := NewClient(&Options{ 120 Regions: ®ion.Region{ 121 Api: region.Endpoints{ 122 Preferred: []string{server_1.URL}, 123 }, 124 }, 125 }) 126 127 var body struct { 128 Test string `json:"Test"` 129 } 130 131 err := httpClient.DoAndAcceptJSON(context.Background(), &Request{ 132 ServiceNames: []region.ServiceName{region.ServiceApi}, 133 Method: http.MethodGet, 134 Path: "/test", 135 RawQuery: "fakeRawQuery", 136 Query: url.Values{ 137 "x-query-1": {"x-value-1"}, 138 "x-query-2": {"x-value-2"}, 139 }, 140 Header: http.Header{ 141 "x-qiniu-1": {"x-value-1"}, 142 "x-qiniu-2": {"x-value-2"}, 143 }, 144 Credentials: credentials.NewCredentials("TestAk", "TestSk"), 145 }, &body) 146 if err != nil { 147 t.Fatalf("Unexpected error: %s", err) 148 } 149 if body.Test != "AccessKey" { 150 t.Fatalf("Unexpected body: %#v", body) 151 } 152 }