From d97f22ea0f57f46635d1b6e5b91e05ff38ac34b4 Mon Sep 17 00:00:00 2001 From: liangzy Date: Thu, 6 Aug 2020 15:41:02 +0800 Subject: [PATCH] init project --- sdk/auth/rpc_signature_composer.go | 48 ++++++++++++++++++++++++++++-- sdk/auth/signer.go | 7 +++++ sdk/client.go | 11 +++++-- sdk/requests/request.go | 8 +++++ sdk/utils/debug.go | 22 ++++++++++++-- services/jedi/client.go | 2 +- services/jedi/demo_test.go | 15 ++++++++++ services/jedi/send_sms.go | 7 +++-- 8 files changed, 109 insertions(+), 11 deletions(-) create mode 100644 services/jedi/demo_test.go diff --git a/sdk/auth/rpc_signature_composer.go b/sdk/auth/rpc_signature_composer.go index 77ee2da..c30619d 100644 --- a/sdk/auth/rpc_signature_composer.go +++ b/sdk/auth/rpc_signature_composer.go @@ -2,10 +2,13 @@ package auth import ( "bytes" + "errors" "fmt" "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" + "net/http" "net/url" + "strconv" "strings" "time" ) @@ -54,8 +57,11 @@ func buildRpcStringToSign(request requests.AcsRequest) (stringToSign string) { for key, value := range request.GetQueryParams() { signParams[key] = value } - for key, value := range request.GetFormParams() { - signParams[key] = value + + if strings.ToUpper(request.GetMethod()) == requests.POST { + for key, value := range request.GetFormParams() { + signParams[key] = value + } } stringToSign = utils.GetUrlFormedMap(signParams) @@ -66,3 +72,41 @@ func buildRpcStringToSign(request requests.AcsRequest) (stringToSign string) { stringToSign = request.GetMethod() + "&%2F&" + stringToSign return } + +func unsignRpcRequest(request *http.Request, signer Signer) (err error) { + signParams := make(map[string]string) + for key, value := range request.URL.Query() { + signParams[key] = value[0] + } + + if strings.ToUpper(request.Method) == requests.POST { + for key, value := range request.Form { + signParams[key] = value[0] + } + } + + signValue, ok := signParams["sign"] + if !ok { + return errors.New("sign value is not exists") + } + + stringToSign := utils.GetUrlFormedMap(signParams) + stringToSign = strings.Replace(stringToSign, "+", "%20", -1) + stringToSign = strings.Replace(stringToSign, "*", "%2A", -1) + stringToSign = strings.Replace(stringToSign, "%7E", "~", -1) + stringToSign = url.QueryEscape(stringToSign) + stringToSign = request.Method + "&%2F&" + stringToSign + + if timestamp, err := strconv.ParseInt(signParams["access_time"], 10, 64); err != nil { + return err + } else { + if time.Unix(timestamp, 0).Before(time.Now().Add(-5 * time.Minute)) { + err = errors.New("sign timeout 5 minute") + } + } + + if signer.Sign(stringToSign, "&") != signValue { + return errors.New("sign string is not correct") + } + return +} diff --git a/sdk/auth/signer.go b/sdk/auth/signer.go index 13bc245..86ffa8c 100644 --- a/sdk/auth/signer.go +++ b/sdk/auth/signer.go @@ -6,6 +6,7 @@ import ( "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/signers" "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" + "net/http" ) type Signer interface { @@ -32,3 +33,9 @@ func Sign(request requests.AcsRequest, signer Signer) (err error) { err = signRpcRequest(request, signer) return } + +func UnSign(request *http.Request, signer Signer) (err error) { + //TODO 根据rpc和roa两种风格签名,自行选择 + err = unsignRpcRequest(request, signer) + return +} diff --git a/sdk/client.go b/sdk/client.go index bec4614..d636928 100644 --- a/sdk/client.go +++ b/sdk/client.go @@ -25,6 +25,12 @@ var defaultReadTimeout = 10 * time.Second var defaultDomain = ".gaore.com" var DefaultUserAgent = fmt.Sprintf("GaoreGoSdk (%s;%s) Golang/%s Core/%s", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), Version) +var debug utils.Debug + +func init() { + debug = utils.Init("sdk") +} + type Client struct { Host string httpClient *http.Client @@ -36,7 +42,6 @@ type Client struct { httpProxy string httpsProxy string noProxy string - debug utils.Debug } func (client *Client) GetNoProxy() string { @@ -89,7 +94,6 @@ func (client *Client) InitWithAccessKey(accessKeyId, accessKeySecret, accessKeyF func (client *Client) InitWithOptions(config *Config, credential auth.Credential) (err error) { client.httpClient = &http.Client{} client.config = config - client.debug = utils.Init("sdk", true) if config.Transport != nil { client.httpClient.Transport = config.Transport @@ -281,7 +285,8 @@ func (client *Client) buildRequestWithSigner(request requests.AcsRequest, signer userAgent := DefaultUserAgent httpRequest.Header.Set("User-Agent", userAgent) - client.debug("%s", request.GetStringToSign()) + debug("%s", request.GetStringToSign()) + debug("%s", httpRequest.Method) return } diff --git a/sdk/requests/request.go b/sdk/requests/request.go index 2384efb..f3659e5 100644 --- a/sdk/requests/request.go +++ b/sdk/requests/request.go @@ -3,6 +3,7 @@ package requests import ( "errors" "fmt" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" "io" "math/cmplx" "reflect" @@ -43,6 +44,12 @@ const ( HeaderSeparator = "\n" ) +var debug utils.Debug + +func init() { + debug = utils.Init("request") +} + type AcsRequest interface { GetReadTimeout() time.Duration GetConnectTimeout() time.Duration @@ -222,6 +229,7 @@ func flatRepeatedList(reflectValue reflect.Value, request AcsRequest, position s } fieldDefault, _ := field.Tag.Lookup("default") + debug("%s %s %s", name, fieldPosition, fieldDefault) if isContiansNameTag { var value string switch field.Type.Kind() { diff --git a/sdk/utils/debug.go b/sdk/utils/debug.go index 79ec39c..9e3a48b 100644 --- a/sdk/utils/debug.go +++ b/sdk/utils/debug.go @@ -1,6 +1,10 @@ package utils -import "fmt" +import ( + "fmt" + "os" + "strings" +) type Debug func(format string, v ...interface{}) @@ -8,7 +12,21 @@ var hookPrint = func(input string) { fmt.Println(input) } -func Init(flag string, enable bool) Debug { +var hookGetEnv = func() string { + return os.Getenv("DEBUG") +} + +func Init(flag string) Debug { + + enable := false + env := hookGetEnv() + parts := strings.Split(env, ",") + for _, part := range parts { + if part == flag { + enable = true + break + } + } return func(format string, v ...interface{}) { if enable { diff --git a/services/jedi/client.go b/services/jedi/client.go index 44025e8..1410b7b 100644 --- a/services/jedi/client.go +++ b/services/jedi/client.go @@ -3,7 +3,7 @@ package jedi import "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" const ( - HOST = "jedi.gaore.com" + HOST = "jedi" VERSION = "2020-08-04" ) diff --git a/services/jedi/demo_test.go b/services/jedi/demo_test.go new file mode 100644 index 0000000..64f19c8 --- /dev/null +++ b/services/jedi/demo_test.go @@ -0,0 +1,15 @@ +package jedi + +import ( + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" + "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" +) + +type DemoTestRequest struct { + *requests.RpcRequest +} + +type DemoTestResponse struct { + *responses.BaseResponse + Data interface{} `json:"data"` +} diff --git a/services/jedi/send_sms.go b/services/jedi/send_sms.go index fb98354..027067b 100644 --- a/services/jedi/send_sms.go +++ b/services/jedi/send_sms.go @@ -7,9 +7,10 @@ import ( type SendSmsRequest struct { *requests.RpcRequest - User string `position:"Query" field:"user" default:"" ` - Code string `position:"Query" field:"code" default:"" ` - Params string `position:"Query" field:"params" default:"" ` + User string `position:"Query" field:"user" default:"" ` + Code string `position:"Query" field:"code" default:"" ` + Params string `position:"Query" field:"params" default:"" ` + TestBody string `position:"Body" field:"test_body" default:"2121" ` } type SendSmsResponseData struct {