From 787ba7e0652a24d10b29a7721e8c42f51fc715d0 Mon Sep 17 00:00:00 2001 From: peze <954152927@qq.com> Date: Mon, 24 Feb 2025 23:33:14 +0800 Subject: [PATCH] fix the testcase by go sse --- .github/workflows/go.yml | 2 +- golang/client/client.go | 31 ++---- golang/client/client_test.go | 136 ++++++++++++++++++++++-- golang/go.mod | 2 +- golang/go.sum | 2 + golang/utils/client.go | 197 +++++++++++++++++------------------ 6 files changed, 239 insertions(+), 131 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index cfa615a..6767ff2 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -33,7 +33,7 @@ jobs: - name: Build run: go mod tidy - name: Test - run: go test -race -coverprofile=coverage.txt -covermode=atomic ./client/... + run: go test -race -coverprofile=coverage.txt -covermode=atomic ./client/... ./utils/... - uses: codecov/codecov-action@v4 with: flags: golang # optional diff --git a/golang/client/client.go b/golang/client/client.go index 95c791a..c59446a 100644 --- a/golang/client/client.go +++ b/golang/client/client.go @@ -1523,7 +1523,9 @@ func (client *Client) Execute(params *openapiutil.Params, request *openapiutil.O return _result, _resultErr } -func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiutil.OpenApiRequest, runtime *dara.RuntimeOptions) (_result <-chan *SSEResponse, _err error) { +func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiutil.OpenApiRequest, runtime *dara.RuntimeOptions, _yield chan *SSEResponse, _yieldErr chan error) { + defer close(_yield) + defer close(_yieldErr) _runtime := dara.NewRuntimeObject(map[string]interface{}{ "key": dara.ToString(dara.Default(dara.StringValue(runtime.Key), dara.StringValue(client.Key))), "cert": dara.ToString(dara.Default(dara.StringValue(runtime.Cert), dara.StringValue(client.Cert))), @@ -1710,9 +1712,7 @@ func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiuti continue } - _yield := make(chan *SSEResponse) - _yieldErr := make(chan error, 1) - go callSSEApi_opResponse(_yield, _yieldErr, response_) + callSSEApi_opResponse(_yield, _yieldErr, response_) _err = <-_yieldErr if _err != nil { retriesAttempted++ @@ -1726,13 +1726,10 @@ func (client *Client) CallSSEApi(params *openapiutil.Params, request *openapiuti continue } - _result = _yield - return _result, _err - } - if dara.BoolValue(client.DisableSDKError) != true { - _resultErr = dara.TeaSDKError(_resultErr) + return } - return _result, _resultErr + _yieldErr <- _resultErr + return } @@ -2428,9 +2425,7 @@ func doRequest_opResponse (response_ *dara.Response, client *Client, params *ope } -func callSSEApi_opResponse(_yield chan<- *SSEResponse, _yieldErr chan<- error, response_ *dara.Response) { - defer close(_yield) - defer close(_yieldErr) +func callSSEApi_opResponse(_yield chan *SSEResponse, _yieldErr chan error, response_ *dara.Response) { if (dara.IntValue(response_.StatusCode) >= 400) && (dara.IntValue(response_.StatusCode) < 600) { err := map[string]interface{}{} if !dara.IsNil(response_.Headers["content-type"]) && dara.StringValue(response_.Headers["content-type"]) == "text/xml;charset=utf-8" { @@ -2464,14 +2459,8 @@ func callSSEApi_opResponse(_yield chan<- *SSEResponse, _yieldErr chan<- error, r return } - events, _err := dara.ReadAsSSE(response_.Body) - if _err != nil { - for tmpErr := range _err { - _yieldErr <- tmpErr - } - return - } - + events := make(chan *dara.SSEEvent, 1) + dara.ReadAsSSE(response_.Body, events, _yieldErr) for event := range events { _yield <- &SSEResponse{ StatusCode: response_.StatusCode, diff --git a/golang/client/client_test.go b/golang/client/client_test.go index 8acb7a8..242f53c 100644 --- a/golang/client/client_test.go +++ b/golang/client/client_test.go @@ -9,11 +9,13 @@ import ( "strings" "testing" "time" + "fmt" pop "github.com/alibabacloud-go/alibabacloud-gateway-pop/client" openapiutil "github.com/alibabacloud-go/darabonba-openapi/v2/utils" util "github.com/alibabacloud-go/tea-utils/v2/service" "github.com/alibabacloud-go/tea/tea" + "github.com/alibabacloud-go/tea/dara" tea_util "github.com/alibabacloud-go/tea/utils" credential "github.com/aliyun/credentials-go/credentials" ) @@ -22,7 +24,53 @@ type mockHandler struct { content string } +func (mock *mockHandler) handleSSE(w http.ResponseWriter, req *http.Request) { + headers := map[string]string{ + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + "Connection": "keep-alive", + } + w.WriteHeader(200) + for key, value := range headers { + w.Header().Set(key, value) + } + + flusher, ok := w.(http.Flusher) + if !ok { + http.Error(w, "Streaming not supported", http.StatusInternalServerError) + return + } + + count := 0 + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + for range ticker.C { + if count >= 5 { + break + } + + _, err := fmt.Fprintf(w, "data: %s\nevent: flow\nid: sse-test\nretry: 3\n:heartbeat\n\n", fmt.Sprintf(`{"count": %d}`, count)) + if err != nil { + fmt.Println("Error writing to client:", err) + break + } + + flusher.Flush() + count++ + } + + // Ensure any buffered data is sent to client before closing + flusher.Flush() +} + + func (mock *mockHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + if req.URL.Path == "/sse" { + mock.handleSSE(w, req) + return + } + if req.Header != nil { nv := 0 for k, vv := range req.Header { @@ -454,7 +502,7 @@ func TestCallApiForRPCWithV2Sign_AK_Form(t *testing.T) { find := regx.FindAllString(tea.StringValue(str), -1) tea_util.AssertNotNil(t, find) str, _ = util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) tea_util.AssertEqual(t, "global-value", headers["global-key"]) tea_util.AssertEqual(t, "2022-06-01", headers["x-acs-version"]) @@ -500,6 +548,11 @@ func TestCallApiForRPCWithV2Sign_AK_Form(t *testing.T) { err := _err.(*tea.SDKError) tea_util.AssertEqual(t, "InvalidCredentials", tea.StringValue(err.Code)) tea_util.AssertEqual(t, "Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.", tea.StringValue(err.Message)) + client.DisableSDKError = tea.Bool(true); + _, _err = client.CallApi(params, request, runtime) + err2 := _err.(*ClientError) + tea_util.AssertEqual(t, "InvalidCredentials", tea.StringValue(err2.GetCode())) + tea_util.AssertEqual(t, "Please set up the credentials correctly. If you are setting them through environment variables, please ensure that ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set correctly. See https://help.aliyun.com/zh/sdk/developer-reference/configure-the-alibaba-cloud-accesskey-environment-variable-on-linux-macos-and-windows-systems for more details.", err2.Error()) } func TestCallApiForRPCWithV2Sign_Anonymous_JSON(t *testing.T) { @@ -543,7 +596,7 @@ func TestCallApiForRPCWithV2Sign_Anonymous_JSON(t *testing.T) { find := regx.FindAllString(tea.StringValue(str), -1) tea_util.AssertNotNil(t, find) str, _ = util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) tea_util.AssertEqual(t, "global-value", headers["global-key"]) tea_util.AssertEqual(t, "extends-value", headers["extends-key"]) @@ -606,7 +659,7 @@ func TestCallApiForROAWithV2Sign_HTTPS_AK_Form(t *testing.T) { tea_util.AssertEqual(t, "key1=value&key2=1&key3=true", headers["raw-body"]) tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"]) str, _ := util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) str, _ = util.AssertAsString(headers["authorization"]) has = strings.Contains(tea.StringValue(str), "acs ak:") @@ -748,7 +801,7 @@ func TestCallApiForROAWithV2Sign_Anonymous_JSON(t *testing.T) { tea_util.AssertEqual(t, "{\"key1\":\"value\",\"key2\":1,\"key3\":true}", headers["raw-body"]) tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"]) str, _ := util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) tea_util.AssertEqual(t, "global-value", headers["global-key"]) tea_util.AssertEqual(t, "extends-value", headers["extends-key"]) @@ -816,7 +869,7 @@ func TestCallApiForRPCWithV3Sign_AK_Form(t *testing.T) { tea_util.AssertEqual(t, "key1=value&key2=1&key3=true", headers["raw-body"]) tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"]) str, _ := util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) str, _ = util.AssertAsString(headers["authorization"]) has = strings.Contains(tea.StringValue(str), "ACS3-HMAC-SHA256 Credential=ak,"+ @@ -916,7 +969,7 @@ func TestCallApiForRPCWithV3Sign_Anonymous_JSON(t *testing.T) { tea_util.AssertEqual(t, "{\"key1\":\"value\",\"key2\":1,\"key3\":true}", headers["raw-body"]) tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"]) str, _ := util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) tea_util.AssertEqual(t, "sdk", headers["for-test"]) tea_util.AssertEqual(t, "global-value", headers["global-key"]) @@ -983,7 +1036,7 @@ func TestCallApiForROAWithV3Sign_AK_Form(t *testing.T) { tea_util.AssertEqual(t, "key1=value&key2=1&key3=true", headers["raw-body"]) tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"]) str, _ := util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) str, _ = util.AssertAsString(headers["authorization"]) has = strings.Contains(tea.StringValue(str), "ACS3-HMAC-SHA256 Credential=ak,"+ @@ -1084,7 +1137,7 @@ func TestCallApiForROAWithV3Sign_Anonymous_JSON(t *testing.T) { tea_util.AssertEqual(t, "{\"key1\":\"value\",\"key2\":1,\"key3\":true}", headers["raw-body"]) tea_util.AssertEqual(t, "extends-key=extends-value&global-query=global-value&key1=value&key2=1&key3=true", headers["raw-query"]) str, _ := util.AssertAsString(headers["user-agent"]) - has := strings.Contains(tea.StringValue(str), "Darabonba/2 config.userAgent") + has := strings.Contains(tea.StringValue(str), "TeaDSL/2 config.userAgent") tea_util.AssertEqual(t, true, has) tea_util.AssertEqual(t, "sdk", headers["for-test"]) tea_util.AssertEqual(t, "global-value", headers["global-key"]) @@ -1552,7 +1605,14 @@ func TestRetryWithError(t *testing.T) { tea_util.AssertNotNil(t, _err) err := _err.(*tea.SDKError) tea_util.AssertEqual(t, "code: 500, error message request id: A45EE076-334D-5012-9746-A8F828D20FD4", tea.StringValue(err.Message)) + client.DisableSDKError = tea.Bool(true); + _, _err = client.CallApi(params, request, runtime) + err2 := _err.(*ServerError) + tea_util.AssertEqual(t, 500, tea.IntValue(err2.GetStatusCode())) + tea_util.AssertEqual(t, "A45EE076-334D-5012-9746-A8F828D20FD4", tea.StringValue(err2.GetRequestId())) + tea_util.AssertEqual(t, "code: 500, error message request id: A45EE076-334D-5012-9746-A8F828D20FD4", err2.Error()) + client.DisableSDKError = tea.Bool(false); params = &Params{ Action: tea.String("TestAPI"), Version: tea.String("2022-06-01"), @@ -1603,3 +1663,63 @@ func TestRetryWithError(t *testing.T) { _, _err = client.Execute(params, request, runtime) tea_util.AssertNotNil(t, _err) } + +func TestCallSSeApiWithV3Sign_AK_Form(t *testing.T) { + mux := http.NewServeMux() + mux.Handle("/sse", &mockHandler{content: "json"}) + var server *http.Server + server = &http.Server{ + Addr: ":9014", + WriteTimeout: time.Second * 60, + Handler: mux, + } + go server.ListenAndServe() + config := CreateConfig() + runtime := CreateRuntimeOptions() + config.Protocol = tea.String("HTTP") + config.Endpoint = tea.String("127.0.0.1:9014") + client, _err := NewClient(config) + tea_util.AssertNil(t, _err) + request := CreateOpenApiRequest() + params := &Params{ + Action: tea.String("TestAPI"), + Version: tea.String("2022-06-01"), + Protocol: tea.String("HTTPS"), + Pathname: tea.String("/sse"), + Method: tea.String("GET"), + AuthType: tea.String("AK"), + Style: tea.String("ROA"), + ReqBodyType: tea.String("formData"), + BodyType: tea.String("json"), + } + + + // fmt.Println("response:", result) + // fmt.Println("response error:", _err) + // tea_util.AssertNil(t, _err) + events := []*dara.SSEEvent{} + + result := make(chan *SSEResponse, 1) + yieldErr := make(chan error, 1) + go client.CallSSEApi(params, request, runtime, result, yieldErr) + + for resp := range result { + events = append(events, resp.Event) + } + + _err = <- yieldErr + tea_util.AssertNil(t, _err) + + + // for _err = range yieldErr { + // tea_util.AssertNil(t, _err) + // } + tea_util.AssertEqual(t, len(events), 5) + + for index, event := range events { + data := fmt.Sprintf(`{"count": %d}`, index) + tea_util.AssertEqual(t, data, tea.StringValue(event.Data)) + tea_util.AssertEqual(t, "sse-test", tea.StringValue(event.ID)) + tea_util.AssertEqual(t, "flow", tea.StringValue(event.Event)) + } +} \ No newline at end of file diff --git a/golang/go.mod b/golang/go.mod index bc9e8fc..8504d46 100644 --- a/golang/go.mod +++ b/golang/go.mod @@ -6,7 +6,7 @@ require ( github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 github.com/alibabacloud-go/openapi-util v0.1.0 - github.com/alibabacloud-go/tea v1.3.2-0.20250217084427-cf679a8bddfe + github.com/alibabacloud-go/tea v1.3.2 github.com/alibabacloud-go/tea-utils/v2 v2.0.7 github.com/aliyun/credentials-go v1.3.10 github.com/tjfoc/gmsm v1.4.1 diff --git a/golang/go.sum b/golang/go.sum index bfa5714..41c06e9 100644 --- a/golang/go.sum +++ b/golang/go.sum @@ -32,6 +32,8 @@ github.com/alibabacloud-go/tea v1.1.20/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZLAQdpmpXMgwk= github.com/alibabacloud-go/tea v1.3.2-0.20250217084427-cf679a8bddfe h1:oJzdVpaDzOrDdQv1d6HNjP0R9A+ez69LlqNSDY63Hjc= github.com/alibabacloud-go/tea v1.3.2-0.20250217084427-cf679a8bddfe/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea v1.3.2-0.20250225033757-8d3b5385f0fa h1:O/+WQGqi2yvNtAavN1ypOlUbpBLPS+Y2gzV3Hiql/5o= +github.com/alibabacloud-go/tea v1.3.2-0.20250225033757-8d3b5385f0fa/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= github.com/alibabacloud-go/tea-utils v1.3.1 h1:iWQeRzRheqCMuiF3+XkfybB3kTgUXkXX+JMrqfLeB2I= github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= github.com/alibabacloud-go/tea-utils/v2 v2.0.5/go.mod h1:dL6vbUT35E4F4bFTHL845eUloqaerYBYPsdWR2/jhe4= diff --git a/golang/utils/client.go b/golang/utils/client.go index 738a93b..add3e8a 100644 --- a/golang/utils/client.go +++ b/golang/utils/client.go @@ -4,8 +4,8 @@ package utils import ( "bytes" "crypto" - "crypto/md5" "crypto/hmac" + "crypto/md5" "crypto/rand" "crypto/rsa" "crypto/sha1" @@ -19,24 +19,23 @@ import ( "fmt" "hash" "io" - "runtime" - "sync/atomic" + mathRand "math/rand" "net/http" "net/textproto" "net/url" "reflect" + "runtime" "sort" "strconv" "strings" + "sync/atomic" "time" - mathRand "math/rand" + models "github.com/alibabacloud-go/darabonba-openapi/v2/models" "github.com/alibabacloud-go/tea/dara" - models "github.com/alibabacloud-go/darabonba-openapi/v2/models" "github.com/tjfoc/gmsm/sm3" ) - type Config = models.Config type GlobalParameters = models.GlobalParameters type Params = models.Params @@ -47,8 +46,7 @@ const ( PEM_END = "\n-----END RSA PRIVATE KEY-----" ) - -var defaultUserAgent = fmt.Sprintf("AlibabaCloud (%s; %s) Golang/%s Core/%s Darabonba/2", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), "0.01") +var defaultUserAgent = fmt.Sprintf("AlibabaCloud (%s; %s) Golang/%s Core/%s TeaDSL/2", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), "0.01") var seqId int64 = 0 var processStartTime int64 = time.Now().UnixNano() / 1e6 @@ -92,20 +90,20 @@ func (hs *Sorter) Swap(i, j int) { } // Description: -// +// // This is for OpenApi Util // Description: -// -// Convert all params of body other than type of readable into content -// +// +// # Convert all params of body other than type of readable into content +// // @param body - source Model -// +// // @param content - target Model -// +// // @return void -func Convert (body interface{}, content interface{}) { - res := make(map[string]interface{}) +func Convert(body interface{}, content interface{}) { + res := make(map[string]interface{}) val := reflect.ValueOf(body).Elem() dataType := val.Type() for i := 0; i < dataType.NumField(); i++ { @@ -122,14 +120,14 @@ func Convert (body interface{}, content interface{}) { } // Description: -// -// Get throttling param -// +// +// # Get throttling param +// // @param the - response headers -// +// // @return time left -func GetThrottlingTimeLeft (headers map[string]*string) (_result *int64) { - rateLimitForUserApi := headers["x-ratelimit-user-api"] +func GetThrottlingTimeLeft(headers map[string]*string) (_result *int64) { + rateLimitForUserApi := headers["x-ratelimit-user-api"] rateLimitForUser := headers["x-ratelimit-user"] timeLeftForUserApi := getTimeLeft(rateLimitForUserApi) timeLeftForUser := getTimeLeft(rateLimitForUser) @@ -141,16 +139,16 @@ func GetThrottlingTimeLeft (headers map[string]*string) (_result *int64) { } // Description: -// -// Hash the raw data with signatureAlgorithm -// +// +// # Hash the raw data with signatureAlgorithm +// // @param raw - hashing data -// +// // @param signatureAlgorithm - the autograph method -// +// // @return hashed bytes -func Hash (raw []byte, signatureAlgorithm *string) (_result []byte) { - signType := dara.StringValue(signatureAlgorithm) +func Hash(raw []byte, signatureAlgorithm *string) (_result []byte) { + signType := dara.StringValue(signatureAlgorithm) if signType == "ACS3-HMAC-SHA256" || signType == "ACS3-RSA-SHA256" { h := sha256.New() h.Write(raw) @@ -174,12 +172,12 @@ func getGID() uint64 { } // Description: -// -// Generate a nonce string -// +// +// # Generate a nonce string +// // @return the nonce string -func GetNonce () (_result *string) { - routineId := getGID() +func GetNonce() (_result *string) { + routineId := getGID() currentTime := time.Now().UnixNano() / 1e6 seq := atomic.AddInt64(&seqId, 1) randNum := mathRand.Int63() @@ -191,21 +189,21 @@ func GetNonce () (_result *string) { } // Description: -// -// Get the string to be signed according to request -// +// +// # Get the string to be signed according to request +// // @param request - which contains signed messages -// +// // @return the signed string func GetStringToSign(request *dara.Request) (_result *string) { return dara.String(getStringToSign(request)) } func getStringToSign(request *dara.Request) string { - resource := dara.StringValue(request.Pathname) - queryParams := request.Query // sort QueryParams by key var queryKeys []string + resource := dara.StringValue(request.Pathname) + queryParams := request.Query for key := range queryParams { queryKeys = append(queryKeys, key) } @@ -258,30 +256,30 @@ func getSignedStr(req *dara.Request, canonicalizedResource string) string { } // Description: -// -// Get signature according to stringToSign, secret -// +// +// # Get signature according to stringToSign, secret +// // @param stringToSign - the signed string -// +// // @param secret - accesskey secret -// +// // @return the signature -func GetROASignature (stringToSign *string, secret *string) (_result *string) { - h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(dara.StringValue(secret))) +func GetROASignature(stringToSign *string, secret *string) (_result *string) { + h := hmac.New(func() hash.Hash { return sha1.New() }, []byte(dara.StringValue(secret))) io.WriteString(h, dara.StringValue(stringToSign)) signedStr := base64.StdEncoding.EncodeToString(h.Sum(nil)) return dara.String(signedStr) } // Description: -// -// Parse filter into a form string -// +// +// # Parse filter into a form string +// // @param filter - object -// +// // @return the string -func ToForm (filter map[string]interface{}) (_result *string) { - tmp := make(map[string]interface{}) +func ToForm(filter map[string]interface{}) (_result *string) { + tmp := make(map[string]interface{}) byt, _ := json.Marshal(filter) d := json.NewDecoder(bytes.NewReader(byt)) d.UseNumber() @@ -293,7 +291,7 @@ func ToForm (filter map[string]interface{}) (_result *string) { flatRepeatedList(filterValue, result, key) } - m := make(map[string]interface{}) + m := make(map[string]interface{}) for key, value := range result { m[key] = dara.StringValue(value) } @@ -353,34 +351,35 @@ func handleMap(valueField reflect.Value, result map[string]*string, prefix strin } } } + // Description: -// -// Get timestamp -// +// +// # Get timestamp +// // @return the timestamp string -func GetTimestamp () (_result *string) { - gmt := time.FixedZone("GMT", 0) +func GetTimestamp() (_result *string) { + gmt := time.FixedZone("GMT", 0) return dara.String(time.Now().In(gmt).Format("2006-01-02T15:04:05Z")) } // Description: -// -// Get UTC string -// +// +// # Get UTC string +// // @return the UTC string -func GetDateUTCString () (_result *string) { - return dara.String(time.Now().UTC().Format(http.TimeFormat)) +func GetDateUTCString() (_result *string) { + return dara.String(time.Now().UTC().Format(http.TimeFormat)) } // Description: -// +// // Parse filter into a object which's type is map[string]string -// +// // @param filter - query param -// +// // @return the object -func Query (filter interface{}) (_result map[string]*string) { - tmp := make(map[string]interface{}) +func Query(filter interface{}) (_result map[string]*string) { + tmp := make(map[string]interface{}) byt, _ := json.Marshal(filter) d := json.NewDecoder(bytes.NewReader(byt)) d.UseNumber() @@ -396,33 +395,33 @@ func Query (filter interface{}) (_result map[string]*string) { } // Description: -// -// Get signature according to signedParams, method and secret -// +// +// # Get signature according to signedParams, method and secret +// // @param signedParams - params which need to be signed -// +// // @param method - http method e.g. GET -// +// // @param secret - AccessKeySecret -// +// // @return the signature -func GetRPCSignature (signedParams map[string]*string, method *string, secret *string) (_result *string) { - stringToSign := buildRpcStringToSign(signedParams, dara.StringValue(method)) +func GetRPCSignature(signedParams map[string]*string, method *string, secret *string) (_result *string) { + stringToSign := buildRpcStringToSign(signedParams, dara.StringValue(method)) signature := sign(stringToSign, dara.StringValue(secret), "&") return dara.String(signature) } // Description: -// -// Parse array into a string with specified style -// +// +// # Parse array into a string with specified style +// // @param array - the array -// +// // @param prefix - the prefix string -// +// // @return the string -func ArrayToStringWithSpecifiedStyle (array interface{}, prefix *string, style *string) (_result *string) { - if dara.IsNil(array) { +func ArrayToStringWithSpecifiedStyle(array interface{}, prefix *string, style *string) (_result *string) { + if dara.IsNil(array) { return dara.String("") } @@ -441,22 +440,22 @@ func ArrayToStringWithSpecifiedStyle (array interface{}, prefix *string, style * } // Description: -// -// Get the authorization -// +// +// # Get the authorization +// // @param request - request params -// +// // @param signatureAlgorithm - the autograph method -// +// // @param payload - the hashed request -// +// // @param accessKey - the accessKey string -// +// // @param accessKeySecret - the accessKeySecret string -// +// // @return authorization string -func GetAuthorization (request *dara.Request, signatureAlgorithm *string, payload *string, accessKey *string, accessKeySecret *string) (_result *string) { - canonicalURI := dara.StringValue(request.Pathname) +func GetAuthorization(request *dara.Request, signatureAlgorithm *string, payload *string, accessKey *string, accessKeySecret *string) (_result *string) { + canonicalURI := dara.StringValue(request.Pathname) if canonicalURI == "" { canonicalURI = "/" } @@ -473,16 +472,15 @@ func GetAuthorization (request *dara.Request, signatureAlgorithm *string, payloa strings.Join(signedHeaders, ";") + "\n" + dara.StringValue(payload) signType := dara.StringValue(signatureAlgorithm) StringToSign := signType + "\n" + hex.EncodeToString(Hash([]byte(canonicalRequest), signatureAlgorithm)) - fmt.Printf("fasdfasdf: %s\n", hex.EncodeToString(Hash([]byte(canonicalRequest), signatureAlgorithm))) signature := hex.EncodeToString(SignatureMethod(dara.StringValue(accessKeySecret), StringToSign, signType)) auth := signType + " Credential=" + dara.StringValue(accessKey) + ",SignedHeaders=" + strings.Join(signedHeaders, ";") + ",Signature=" + signature - fmt.Printf("%s\n", auth); + fmt.Printf("%s\n", auth) return dara.String(auth) } -func GetUserAgent (userAgent *string) (_result *string) { - if userAgent != nil && dara.StringValue(userAgent) != "" { +func GetUserAgent(userAgent *string) (_result *string) { + if userAgent != nil && dara.StringValue(userAgent) != "" { return dara.String(defaultUserAgent + " " + dara.StringValue(userAgent)) } return dara.String(defaultUserAgent) @@ -689,7 +687,6 @@ func getCanonicalHeaders(headers map[string]*string) (string, []string) { sort.Strings(vals) canonicalheaders += key + ":" + strings.Join(vals, ",") + "\n" } - return canonicalheaders, hs.Keys } @@ -767,4 +764,4 @@ func GetEndpointRules(product, regionId, endpointType, network, suffix *string) "", "-"+dara.StringValue(suffix), 1)) } return _result, nil -} \ No newline at end of file +}