fork from gaore-common-sdk-go
This commit is contained in:
		
						commit
						1bd1a66cfe
					
				
							
								
								
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | # Created by .ignore support plugin (hsz.mobi) | ||||||
|  | ### Example user template template | ||||||
|  | ### Example user template | ||||||
|  | 
 | ||||||
|  | # IntelliJ project files | ||||||
|  | .idea | ||||||
|  | *.iml | ||||||
|  | out | ||||||
|  | gen | ||||||
							
								
								
									
										179
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										179
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,179 @@ | |||||||
|  | # gaore-common-sdk-go | ||||||
|  | 
 | ||||||
|  | ### 1.目录架构 | ||||||
|  | ``` | ||||||
|  | ├── README.md | ||||||
|  | ├── sdk | ||||||
|  | │   ├── auth                    `认证类` | ||||||
|  | │   ├── client.go               `客户端主入口类` | ||||||
|  | │   ├── config.go | ||||||
|  | │   ├── requests                `请求类` | ||||||
|  | │   ├── responses               `响应类` | ||||||
|  | │   └── utils                   `工具类` | ||||||
|  | └── services | ||||||
|  |     └── jedi | ||||||
|  | ``` | ||||||
|  | ### 2.引入 | ||||||
|  | ```go | ||||||
|  | go get -u golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk | ||||||
|  | ``` | ||||||
|  | 或 Go Module  | ||||||
|  | ```go | ||||||
|  | import "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### 3.服务端认证及返回处理 | ||||||
|  | 
 | ||||||
|  | 调用 `auth.UnSign` 方法,提供`*http.Request`请求实例,以及`signer.Signer` 签名器(签名器需要包括凭据) | ||||||
|  | 即可完成整个验签过程  | ||||||
|  | 
 | ||||||
|  | 这里以`beego`为例 : | ||||||
|  | ```go | ||||||
|  | package applications | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  |     "github.com/astaxie/beego" | ||||||
|  |     "github.com/astaxie/beego/context" | ||||||
|  |     "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth" | ||||||
|  |     "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials" | ||||||
|  |     "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/signers" | ||||||
|  |     "golib.gaore.com/GaoreGo/grlogs" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  |     // 过滤器 | ||||||
|  |     beego.InsertFilter("/api/*", beego.BeforeRouter, func(context *context.Context) { | ||||||
|  |         httpRequest := context.Request | ||||||
|  |         err := auth.UnSign(httpRequest, signers.NewAccessKeySigner(&credentials.AccessKeyCredential{ | ||||||
|  |             AccessKeyId:     "aaaaaa", | ||||||
|  |             AccessKeySecret: "bbbbbb", | ||||||
|  |             AccessKeyFrom:   context.Input.Param("access_from"), | ||||||
|  |         })) | ||||||
|  | 
 | ||||||
|  |         if err != nil { | ||||||
|  |             resp := response.NewJsonByDefaultFailed() | ||||||
|  |             resp.Msg = err.Error() | ||||||
|  |             resp.Code = 10086 | ||||||
|  | 
 | ||||||
|  |             var ( | ||||||
|  |                 hasIndent = beego.BConfig.RunMode != beego.PROD | ||||||
|  |             ) | ||||||
|  |             context.Output.Status = 500 | ||||||
|  |             context.Output.JSON(resp, hasIndent, false) | ||||||
|  |         } | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 服务端返回的响应体为以下结构的json字符流, `code`,`status`,`msg` 这三个字段*最好*要包含且数据类型要一致  , `data` 部分为业务内容,自行定义 | ||||||
|  | ```json | ||||||
|  | { | ||||||
|  |     "code": 1001, | ||||||
|  |     "msg": "不能为空", | ||||||
|  |     "status": false, | ||||||
|  |     "data": { | ||||||
|  |         ... | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ### 4.sdk编写 | ||||||
|  | 
 | ||||||
|  | 在`services`目录下以服务归类新建文件夹, 如`jedi`为短信服务,以 `RpcRequest` 和 `BaseResponse` 以基类写好请求子类和响应子类。一个请求接口对应一对请求和响应类。 | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | import "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	HOST    = "jedi"  // 如果非全域名会自动补全.gaore.com , 如jedi 会自动补全jedi.goare.com, 也可以打全域名 test.uu89.com | ||||||
|  | 	VERSION = "2020-08-04" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	err = client.InitWithAccessKey(accesskey, secrect, source) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) Test(req *DemoTestRequest) (response *DemoTestResponse, err error) { | ||||||
|  | 	response = CreateDemoTestResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 请求类,对参数用标签解释, 如 `position:"Query" field:"param_1" default:""` , 有三个字段 `position` , `field`, `default`  | ||||||
|  | 
 | ||||||
|  | - `position` 为标志该参数为请求体对应的位置, `Query` query参数, `Body` post请求体参数, `Head`请求头参数 | ||||||
|  | 
 | ||||||
|  | - `field` 解释成参数实际名称 | ||||||
|  | 
 | ||||||
|  | - `default` 默认值  | ||||||
|  | 
 | ||||||
|  | ```go | ||||||
|  | type DemoTestRequest struct { | ||||||
|  |     *requests.RpcRequest | ||||||
|  |     Param1 string `position:"Query" field:"param_1" default:"" ` | ||||||
|  |     Param2 int    `position:"Query" field:"param_2" default:"10086" ` | ||||||
|  |     Param3 bool   `position:"Query" field:"param_3" default:"false" ` | ||||||
|  | } | ||||||
|  | ``` | ||||||
|  | 对应解释成http请求为: | ||||||
|  | ```go | ||||||
|  | GET param_1=111¶m_2=10086¶m_3=false | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 完整示例: | ||||||
|  | ```go | ||||||
|  | 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 | ||||||
|  |     Param1 string `position:"Query" field:"param_1" default:"" ` | ||||||
|  |     Param2 int    `position:"Query" field:"param_2" default:"10086" ` | ||||||
|  |     Param3 bool   `position:"Query" field:"param_3" default:"false" ` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateDemoTestRequest() (req *DemoTestRequest) { | ||||||
|  |     req = &DemoTestRequest{RpcRequest: &requests.RpcRequest{}} | ||||||
|  |     // InitWithApiInfo 初始化请求,有三个参数,域名,版本,和路径 | ||||||
|  |     // 域名参数如果非全域名会自动补全.gaore.com , 如jedi 会自动补全jedi.goare.com, 也可以打全域名 test.uu89.com | ||||||
|  |     req.InitWithApiInfo(HOST, VERSION, "/api/sms/Index") | ||||||
|  |     // 定义 请求方法 POST 或 GET | ||||||
|  |     req.Method = requests.GET | ||||||
|  |     return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 定义响应体 | ||||||
|  | type DemoTestResponse struct { | ||||||
|  |     *responses.BaseResponse | ||||||
|  |     Data DemoTestResponseData `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type DemoTestResponseData struct { | ||||||
|  |     Account string `json:"account"` | ||||||
|  |     Total   int    `json:"total"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateDemoTestResponse() *DemoTestResponse { | ||||||
|  |     return &DemoTestResponse{ | ||||||
|  |         BaseResponse: &responses.BaseResponse{}, | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | 终端调试打开方式, 需要在系统环境变量上加入(三选一): | ||||||
|  | ``` | ||||||
|  | DEBUG=sdk,signer,request | ||||||
|  | ``` | ||||||
							
								
								
									
										21
									
								
								sdk/auth/credentials/access_key_credential.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								sdk/auth/credentials/access_key_credential.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | package credentials | ||||||
|  | 
 | ||||||
|  | type BaseCredential struct { | ||||||
|  | 	AccessKeyId     string `json:"access_key_id" yaml:"access_key_id"` | ||||||
|  | 	AccessKeySecret string `json:"access_key_secret" yaml:"access_key_secret"` | ||||||
|  | 	AccessKeyFrom   string `json:"access_key_from" yaml:"access_key_from"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type AccessKeyCredential struct { | ||||||
|  | 	AccessKeyId     string `json:"access_key_id" yaml:"access_key_id"` | ||||||
|  | 	AccessKeySecret string `json:"access_key_secret" yaml:"access_key_secret"` | ||||||
|  | 	AccessKeyFrom   string `json:"access_key_from" yaml:"access_key_from"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseCred *BaseCredential) ToAccessKeyCredential() *AccessKeyCredential { | ||||||
|  | 	return &AccessKeyCredential{ | ||||||
|  | 		AccessKeyId:     baseCred.AccessKeyId, | ||||||
|  | 		AccessKeySecret: baseCred.AccessKeySecret, | ||||||
|  | 		AccessKeyFrom:   baseCred.AccessKeyFrom, | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								sdk/auth/credentials/ali_appcode_credential.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								sdk/auth/credentials/ali_appcode_credential.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | package credentials | ||||||
|  | 
 | ||||||
|  | type AliAppcodeCredential struct { | ||||||
|  | 	AccessKeyId     string `json:"access_key_id" yaml:"access_key_id"` | ||||||
|  | 	AccessKeySecret string `json:"access_key_secret" yaml:"access_key_secret"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewAliAppcodeCredential(accessKeyId, accessKeySecret string) *AliAppcodeCredential { | ||||||
|  | 	return &AliAppcodeCredential{ | ||||||
|  | 		AccessKeyId:     accessKeyId, | ||||||
|  | 		AccessKeySecret: accessKeySecret, | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								sdk/auth/credentials/sts_token_credential.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								sdk/auth/credentials/sts_token_credential.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | |||||||
|  | package credentials | ||||||
|  | 
 | ||||||
|  | type StdTokenCredential struct { | ||||||
|  | 	AccessKeyId     string `json:"access_key_id" yaml:"access_key_id"` | ||||||
|  | 	AccessKeySecret string `json:"access_key_secret" yaml:"access_key_secret"` | ||||||
|  | 	AccessKeyFrom   string `json:"access_key_from" yaml:"access_key_from"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewStsTokenCredential(accessKeyId, accessKeySecret, accessFrom string) *StdTokenCredential { | ||||||
|  | 	return &StdTokenCredential{ | ||||||
|  | 		AccessKeyId:     accessKeyId, | ||||||
|  | 		AccessKeySecret: accessKeySecret, | ||||||
|  | 		AccessKeyFrom:   accessFrom, | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								sdk/auth/crediantial.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								sdk/auth/crediantial.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | package auth | ||||||
|  | 
 | ||||||
|  | import "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" | ||||||
|  | 
 | ||||||
|  | var debug utils.Debug | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	debug = utils.Init("signer") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Credential interface { | ||||||
|  | } | ||||||
							
								
								
									
										160
									
								
								sdk/auth/rali_signature_composer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								sdk/auth/rali_signature_composer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,160 @@ | |||||||
|  | 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" | ||||||
|  | 	"sort" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func signRaliRequest(request requests.AcsRequest, signer Signer) (err error) { | ||||||
|  | 	err = completeRaliSignParams(request, signer) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	stringToSign := buildRaliStringToSign(request) | ||||||
|  | 	request.SetStringToSign(stringToSign) | ||||||
|  | 	signature := signer.Sign(stringToSign, "") | ||||||
|  | 	request.GetHeaders()["X-Ca-Signature"] = signature | ||||||
|  | 
 | ||||||
|  | 	debug("GrSdk sign: %s", signature) | ||||||
|  | 	debug("GrSdk sign string: %s", strings.ReplaceAll(stringToSign, "\n", "#")) | ||||||
|  | 	debug("GrSdk sign: \r\n") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func completeRaliSignParams(request requests.AcsRequest, signer Signer) (err error) { | ||||||
|  | 
 | ||||||
|  | 	request.GetHeaders()["X-Ca-Timestamp"] = fmt.Sprintf("%d", time.Now().Unix()*1000) | ||||||
|  | 	request.GetHeaders()["X-Ca-Signature-Method"] = signer.GetName() | ||||||
|  | 	request.GetHeaders()["X-Ca-Nonce"] = utils.GetUUID() | ||||||
|  | 	request.GetHeaders()["X-Ca-Key"], err = signer.GetAccessKeyId() | ||||||
|  | 
 | ||||||
|  | 	if request.GetEnv() != "" { | ||||||
|  | 		request.GetHeaders()["X-Ca-Stage"] = request.GetEnv() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if request.GetMethod() == requests.POST { | ||||||
|  | 		request.GetHeaders()["Content-type"] = requests.Form | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	formString := utils.GetUrlFormedMap(request.GetFormParams()) | ||||||
|  | 	request.SetContent(bytes.NewBufferString(formString).Bytes()) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func buildRaliSignHeader(request requests.AcsRequest) (str1, str2 string) { | ||||||
|  | 
 | ||||||
|  | 	headParams := make(map[string]string) | ||||||
|  | 	signatureHeaders := make([]string, 0) | ||||||
|  | 
 | ||||||
|  | 	for key, val := range request.GetHeaders() { | ||||||
|  | 		headParams[key] = val | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	delete(headParams, "X-Ca-Signature") | ||||||
|  | 	delete(headParams, "X-Ca-Signature-Headers") | ||||||
|  | 	delete(headParams, "Accept") | ||||||
|  | 	delete(headParams, "Content-MD5") | ||||||
|  | 	delete(headParams, "Content-Type") | ||||||
|  | 	delete(headParams, "Date") | ||||||
|  | 
 | ||||||
|  | 	for key, _ := range headParams { | ||||||
|  | 		signatureHeaders = append(signatureHeaders, key) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	sort.Strings(signatureHeaders) | ||||||
|  | 
 | ||||||
|  | 	for _, key := range signatureHeaders { | ||||||
|  | 		str1 += fmt.Sprintf("%s:%s\n", key, headParams[key]) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return strings.TrimRight(str1, "\n"), strings.Join(signatureHeaders, ",") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func buildRaliStringToSign(request requests.AcsRequest) (stringToSign string) { | ||||||
|  | 	signParams := make(map[string]string) | ||||||
|  | 	for key, value := range request.GetQueryParams() { | ||||||
|  | 		signParams[key] = value | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if strings.ToUpper(request.GetMethod()) == requests.POST { | ||||||
|  | 		for key, value := range request.GetFormParams() { | ||||||
|  | 			signParams[key] = value | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	str1, str2 := buildRaliSignHeader(request) | ||||||
|  | 
 | ||||||
|  | 	stringToSign = request.GetMethod() + "\n" | ||||||
|  | 	stringToSign += request.GetHeaders()["Accept"] + "\n\n" | ||||||
|  | 	stringToSign += request.GetHeaders()["Content-type"] + "\n\n" | ||||||
|  | 	stringToSign += str1 + "\n" | ||||||
|  | 	stringToSign += request.GetActionName() + "?" + utils.GetUrlByKeySort(signParams) | ||||||
|  | 	request.GetHeaders()["X-Ca-Signature-Headers"] = str2 | ||||||
|  | 
 | ||||||
|  | 	//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.GetMethod() + "&%2F&" + stringToSign
 | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func unsignRaliRequest(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] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if accessKey, err := signer.GetAccessKeyId(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} else if accessKey == "" { | ||||||
|  | 		return errors.New("access key is not allow empty") | ||||||
|  | 	} else if accessKey != signParams["access_key"] { | ||||||
|  | 		return errors.New("illegal access key") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	signValue, ok := signParams["sign"] | ||||||
|  | 	if !ok { | ||||||
|  | 		return errors.New("sign value is not exists") | ||||||
|  | 	} else { | ||||||
|  | 		delete(signParams, "sign") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	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 | ||||||
|  | 	debug("GrSdk sign: %s", 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 | ||||||
|  | } | ||||||
							
								
								
									
										128
									
								
								sdk/auth/roa_signature_composer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								sdk/auth/roa_signature_composer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | |||||||
|  | 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" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func signRoaRequest(request requests.AcsRequest, signer Signer) (err error) { | ||||||
|  | 	err = completeRoaSignParams(request, signer) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if _, isContainsSign := request.GetQueryParams()["sign"]; isContainsSign { | ||||||
|  | 		delete(request.GetQueryParams(), "sign") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	stringToSign := buildRoaStringToSign(request) | ||||||
|  | 	request.SetStringToSign(stringToSign) | ||||||
|  | 	signature := signer.Sign(stringToSign, "&") | ||||||
|  | 	request.GetQueryParams()["sign"] = signature | ||||||
|  | 	debug("GrSdk sign: %s", signature) | ||||||
|  | 	debug("GrSdk sign string: %s", stringToSign) | ||||||
|  | 	debug("GrSdk sign: \r\n") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func completeRoaSignParams(request requests.AcsRequest, signer Signer) (err error) { | ||||||
|  | 
 | ||||||
|  | 	var accessKeyFrom string | ||||||
|  | 	if accessKeyFrom, err = signer.GetAccessKeyFrom(); err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	queryParams := request.GetQueryParams() | ||||||
|  | 	queryParams["access_time"] = fmt.Sprintf("%d", time.Now().Unix()) | ||||||
|  | 	queryParams["access_key"], err = signer.GetAccessKeyId() | ||||||
|  | 	queryParams["access_from"] = accessKeyFrom | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if request.GetMethod() == requests.POST { | ||||||
|  | 		request.GetHeaders()["Content-type"] = requests.Form | ||||||
|  | 	} | ||||||
|  | 	request.GetHeaders()["Gr-Sdk-From"] = accessKeyFrom | ||||||
|  | 	formString := utils.GetUrlFormedMap(request.GetFormParams()) | ||||||
|  | 	request.SetContent(bytes.NewBufferString(formString).Bytes()) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func buildRoaStringToSign(request requests.AcsRequest) (stringToSign string) { | ||||||
|  | 	signParams := make(map[string]string) | ||||||
|  | 	for key, value := range request.GetQueryParams() { | ||||||
|  | 		signParams[key] = value | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if strings.ToUpper(request.GetMethod()) == requests.POST { | ||||||
|  | 		for key, value := range request.GetFormParams() { | ||||||
|  | 			signParams[key] = value | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	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.GetMethod() + "&%2F&" + stringToSign | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func unsignRoaRequest(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] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if accessKey, err := signer.GetAccessKeyId(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} else if accessKey == "" { | ||||||
|  | 		return errors.New("access key is not allow empty") | ||||||
|  | 	} else if accessKey != signParams["access_key"] { | ||||||
|  | 		return errors.New("illegal access key") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	signValue, ok := signParams["sign"] | ||||||
|  | 	if !ok { | ||||||
|  | 		return errors.New("sign value is not exists") | ||||||
|  | 	} else { | ||||||
|  | 		delete(signParams, "sign") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	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 | ||||||
|  | 	debug("GrSdk sign: %s", 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 | ||||||
|  | } | ||||||
							
								
								
									
										126
									
								
								sdk/auth/rpc_signature_composer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								sdk/auth/rpc_signature_composer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,126 @@ | |||||||
|  | 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" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func signRpcRequest(request requests.AcsRequest, signer Signer) (err error) { | ||||||
|  | 	err = completeRpcSignParams(request, signer) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	if _, isContainsSign := request.GetQueryParams()["sign"]; isContainsSign { | ||||||
|  | 		delete(request.GetQueryParams(), "sign") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	stringToSign := buildRpcStringToSign(request) | ||||||
|  | 	request.SetStringToSign(stringToSign) | ||||||
|  | 	signature := signer.Sign(stringToSign, "&") | ||||||
|  | 	request.GetQueryParams()["sign"] = signature | ||||||
|  | 	debug("GrSdk sign: %s", signature) | ||||||
|  | 	debug("GrSdk sign string: %s", stringToSign) | ||||||
|  | 	debug("GrSdk sign: \r\n") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func completeRpcSignParams(request requests.AcsRequest, signer Signer) (err error) { | ||||||
|  | 
 | ||||||
|  | 	var accessKeyFrom string | ||||||
|  | 	if accessKeyFrom, err = signer.GetAccessKeyFrom(); err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	queryParams := request.GetQueryParams() | ||||||
|  | 	queryParams["access_time"] = fmt.Sprintf("%d", time.Now().Unix()) | ||||||
|  | 	queryParams["access_key"], err = signer.GetAccessKeyId() | ||||||
|  | 	queryParams["access_from"] = accessKeyFrom | ||||||
|  | 
 | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	request.GetHeaders()["Content-type"] = requests.Form | ||||||
|  | 	request.GetHeaders()["Gr-Sdk-From"] = accessKeyFrom | ||||||
|  | 	formString := utils.GetUrlFormedMap(request.GetFormParams()) | ||||||
|  | 	request.SetContent(bytes.NewBufferString(formString).Bytes()) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func buildRpcStringToSign(request requests.AcsRequest) (stringToSign string) { | ||||||
|  | 	signParams := make(map[string]string) | ||||||
|  | 	for key, value := range request.GetQueryParams() { | ||||||
|  | 		signParams[key] = value | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if strings.ToUpper(request.GetMethod()) == requests.POST { | ||||||
|  | 		for key, value := range request.GetFormParams() { | ||||||
|  | 			signParams[key] = value | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	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.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] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if accessKey, err := signer.GetAccessKeyId(); err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} else if accessKey == "" { | ||||||
|  | 		return errors.New("access key is not allow empty") | ||||||
|  | 	} else if accessKey != signParams["access_key"] { | ||||||
|  | 		return errors.New("illegal access key") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	signValue, ok := signParams["sign"] | ||||||
|  | 	if !ok { | ||||||
|  | 		return errors.New("sign value is not exists") | ||||||
|  | 	} else { | ||||||
|  | 		delete(signParams, "sign") | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	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 | ||||||
|  | 	debug("GrSdk sign: %s", 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 | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								sdk/auth/signer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								sdk/auth/signer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | |||||||
|  | package auth | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials" | ||||||
|  | 	"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 { | ||||||
|  | 	GetName() string | ||||||
|  | 	GetAccessKeyId() (string, error) | ||||||
|  | 	GetAccessKeyFrom() (string, error) | ||||||
|  | 	Sign(stringToSign, secretSuffix string) string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewSignerWithCredential(credential Credential, commonApi func(request *requests.CommonRequest, signer interface{}) (response *responses.CommonResponse, err error)) (signer Signer, err error) { | ||||||
|  | 	switch instance := credential.(type) { | ||||||
|  | 	case *credentials.AccessKeyCredential: | ||||||
|  | 		signer = signers.NewAccessKeySigner(instance) | ||||||
|  | 	case *credentials.BaseCredential: | ||||||
|  | 		signer = signers.NewAccessKeySigner(instance.ToAccessKeyCredential()) | ||||||
|  | 	case *credentials.StdTokenCredential: | ||||||
|  | 		signer = signers.NewStsTokenSigner(instance) | ||||||
|  | 	case *credentials.AliAppcodeCredential: | ||||||
|  | 		signer = signers.NewAliAppcodeSigner(instance) | ||||||
|  | 	default: | ||||||
|  | 		err = errors.New("UnsupportedCredentialErrorCode  = SDK.UnsupportedCredential") | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Sign(request requests.AcsRequest, signer Signer) (err error) { | ||||||
|  | 	switch signer.(type) { | ||||||
|  | 	case *signers.AliAppcodeSigner: | ||||||
|  | 		err = signRaliRequest(request, signer) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//TODO 根据rpc和roa两种风格签名,自行选择
 | ||||||
|  | 	switch request.GetStyle() { | ||||||
|  | 	case requests.RPC: | ||||||
|  | 		err = signRpcRequest(request, signer) | ||||||
|  | 	case requests.ROA: | ||||||
|  | 		err = signRoaRequest(request, signer) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func UnSign(request *http.Request, signer Signer) (err error) { | ||||||
|  | 	//TODO 根据rpc和roa两种风格签名,自行选择
 | ||||||
|  | 	err = unsignRpcRequest(request, signer) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								sdk/auth/signers/access_key_siginer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								sdk/auth/signers/access_key_siginer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | |||||||
|  | package signers | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/hmac" | ||||||
|  | 	"crypto/sha1" | ||||||
|  | 	"encoding/base64" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type AccessKeySigner struct { | ||||||
|  | 	credential *credentials.AccessKeyCredential | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *AccessKeySigner) GetAccessKeyId() (string, error) { | ||||||
|  | 	return signer.credential.AccessKeyId, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *AccessKeySigner) GetAccessKeyFrom() (string, error) { | ||||||
|  | 	return signer.credential.AccessKeyFrom, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (*AccessKeySigner) GetName() string { | ||||||
|  | 	return "HMAC-SHA1" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *AccessKeySigner) Sign(stringToSign, secretSuffix string) string { | ||||||
|  | 	secret := signer.credential.AccessKeySecret + secretSuffix | ||||||
|  | 	return ShaHmac1(stringToSign, secret) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewAccessKeySigner(credential *credentials.AccessKeyCredential) *AccessKeySigner { | ||||||
|  | 	return &AccessKeySigner{ | ||||||
|  | 		credential: credential, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ShaHmac1(source, secret string) string { | ||||||
|  | 	key := []byte(secret) | ||||||
|  | 	hmac := hmac.New(sha1.New, key) | ||||||
|  | 	hmac.Write([]byte(source)) | ||||||
|  | 	signedBytes := hmac.Sum(nil) | ||||||
|  | 	signedString := base64.StdEncoding.EncodeToString(signedBytes) | ||||||
|  | 	return signedString | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								sdk/auth/signers/ali_appcode_signer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								sdk/auth/signers/ali_appcode_signer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | |||||||
|  | package signers | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/hmac" | ||||||
|  | 	"crypto/sha256" | ||||||
|  | 	"encoding/base64" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type AliAppcodeSigner struct { | ||||||
|  | 	credential *credentials.AliAppcodeCredential | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *AliAppcodeSigner) GetName() string { | ||||||
|  | 	return "HmacSHA256" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *AliAppcodeSigner) GetAccessKeyId() (string, error) { | ||||||
|  | 	return signer.credential.AccessKeyId, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *AliAppcodeSigner) GetAccessKeyFrom() (string, error) { | ||||||
|  | 	return "", nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *AliAppcodeSigner) Sign(stringToSign, secretSuffix string) string { | ||||||
|  | 	secret := signer.credential.AccessKeySecret + secretSuffix | ||||||
|  | 	return ShaHmac256(stringToSign, secret) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewAliAppcodeSigner(credential *credentials.AliAppcodeCredential) *AliAppcodeSigner { | ||||||
|  | 	return &AliAppcodeSigner{ | ||||||
|  | 		credential: credential, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func ShaHmac256(source, secret string) string { | ||||||
|  | 	key := []byte(secret) | ||||||
|  | 	hmac1 := hmac.New(sha256.New, key) | ||||||
|  | 	hmac1.Write([]byte(source)) | ||||||
|  | 	signedString := base64.StdEncoding.EncodeToString(hmac1.Sum(nil)) | ||||||
|  | 	return signedString | ||||||
|  | } | ||||||
							
								
								
									
										41
									
								
								sdk/auth/signers/sts_token_signer.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								sdk/auth/signers/sts_token_signer.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | |||||||
|  | package signers | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/md5" | ||||||
|  | 	"fmt" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type StsTokenSigner struct { | ||||||
|  | 	credential *credentials.StdTokenCredential | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *StsTokenSigner) GetAccessKeyId() (string, error) { | ||||||
|  | 	return signer.credential.AccessKeyId, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *StsTokenSigner) GetAccessKeyFrom() (string, error) { | ||||||
|  | 	return signer.credential.AccessKeyFrom, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (*StsTokenSigner) GetName() string { | ||||||
|  | 	return "MD5" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (signer *StsTokenSigner) Sign(stringToSign, secretSuffix string) string { | ||||||
|  | 	secret := signer.credential.AccessKeySecret + secretSuffix | ||||||
|  | 	return Md5(stringToSign, secret) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewStsTokenSigner(credential *credentials.StdTokenCredential) *StsTokenSigner { | ||||||
|  | 	return &StsTokenSigner{ | ||||||
|  | 		credential: credential, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Md5(source, secret string) string { | ||||||
|  | 	data := []byte(fmt.Sprintf("%s##%s", secret, source)) | ||||||
|  | 	has := md5.Sum(data) | ||||||
|  | 	md5str := fmt.Sprintf("%x", has) | ||||||
|  | 	return md5str | ||||||
|  | } | ||||||
							
								
								
									
										357
									
								
								sdk/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										357
									
								
								sdk/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,357 @@ | |||||||
|  | package sdk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"context" | ||||||
|  | 	"crypto/tls" | ||||||
|  | 	"fmt" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth/credentials" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" | ||||||
|  | 	"net" | ||||||
|  | 	"net/http" | ||||||
|  | 	"net/http/httputil" | ||||||
|  | 	"net/url" | ||||||
|  | 	"os" | ||||||
|  | 	"regexp" | ||||||
|  | 	"runtime" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var Version = "0.0.1" | ||||||
|  | var defaultConnectTimeout = 5 * time.Second | ||||||
|  | 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 | ||||||
|  | 	isInsecure     bool | ||||||
|  | 	signer         auth.Signer | ||||||
|  | 	readTimeout    time.Duration | ||||||
|  | 	connectTimeout time.Duration | ||||||
|  | 	config         *Config | ||||||
|  | 	httpProxy      string | ||||||
|  | 	httpsProxy     string | ||||||
|  | 	noProxy        string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) GetNoProxy() string { | ||||||
|  | 	return client.noProxy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) SetNoProxy(noProxy string) { | ||||||
|  | 	client.noProxy = noProxy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) GetHttpsProxy() string { | ||||||
|  | 	return client.httpsProxy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) SetHttpsProxy(httpsProxy string) { | ||||||
|  | 	client.httpsProxy = httpsProxy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) SetHttpProxy(httpProxy string) { | ||||||
|  | 	client.httpProxy = httpProxy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) GetHttpProxy() string { | ||||||
|  | 	return client.httpProxy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) GetHTTPSInsecure() bool { | ||||||
|  | 	return client.isInsecure | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) InitClientConfig() (config *Config) { | ||||||
|  | 	if client.config != nil { | ||||||
|  | 		return client.config | ||||||
|  | 	} else { | ||||||
|  | 		return NewConfig() | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) InitWithAccessKey(accessKeyId, accessKeySecret, accessKeyFrom string) (err error) { | ||||||
|  | 	config := client.InitWithConfig() | ||||||
|  | 	credential := &credentials.BaseCredential{ | ||||||
|  | 		AccessKeyId:     accessKeyId, | ||||||
|  | 		AccessKeySecret: accessKeySecret, | ||||||
|  | 		AccessKeyFrom:   accessKeyFrom, | ||||||
|  | 	} | ||||||
|  | 	return client.InitWithOptions(config, credential) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) InitWithAliAppcode(accessKeyId, accessKeySecret string, env ...string) (err error) { | ||||||
|  | 	config := client.InitWithConfig() | ||||||
|  | 	credential := credentials.NewAliAppcodeCredential(accessKeyId, accessKeySecret) | ||||||
|  | 
 | ||||||
|  | 	if len(env) > 0 { | ||||||
|  | 		config.Env = env[0] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return client.InitWithOptions(config, credential) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) InitWithStsToken(accessKeyId, accessKeySecret, accessKeyFrom string) (err error) { | ||||||
|  | 	config := client.InitWithConfig() | ||||||
|  | 	credential := &credentials.StdTokenCredential{ | ||||||
|  | 		AccessKeyId:     accessKeyId, | ||||||
|  | 		AccessKeySecret: accessKeySecret, | ||||||
|  | 		AccessKeyFrom:   accessKeyFrom, | ||||||
|  | 	} | ||||||
|  | 	return client.InitWithOptions(config, credential) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) InitWithOptions(config *Config, credential auth.Credential) (err error) { | ||||||
|  | 	client.httpClient = &http.Client{} | ||||||
|  | 	client.config = config | ||||||
|  | 
 | ||||||
|  | 	if config.Transport != nil { | ||||||
|  | 		client.httpClient.Transport = config.Transport | ||||||
|  | 	} else if config.HttpTransport != nil { | ||||||
|  | 		client.httpClient.Transport = config.HttpTransport | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if config.Timeout > 0 { | ||||||
|  | 		client.httpClient.Timeout = config.Timeout | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	client.signer, err = auth.NewSignerWithCredential(credential, client.ProcessCommonRequestWithSigner) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) InitWithConfig() (config *Config) { | ||||||
|  | 	if client.config != nil { | ||||||
|  | 		return client.config | ||||||
|  | 	} else { | ||||||
|  | 		return NewConfig() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) ProcessCommonRequestWithSigner(request *requests.CommonRequest, signerInterface interface{}) (response *responses.CommonResponse, err error) { | ||||||
|  | 	if signer, isSigner := signerInterface.(auth.Signer); isSigner { | ||||||
|  | 		response = responses.NewCommonResponse() | ||||||
|  | 		err = client.DoActionWithSigner(request, response, signer) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	panic("should not be here") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Timeout(connectTimeout time.Duration) func(ctx context.Context, net, addr string) (c net.Conn, err error) { | ||||||
|  | 	return func(ctx context.Context, network, address string) (c net.Conn, err error) { | ||||||
|  | 		return (&net.Dialer{ | ||||||
|  | 			Timeout:   connectTimeout, | ||||||
|  | 			DualStack: true, | ||||||
|  | 		}).DialContext(ctx, network, address) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) setTimeOut(request requests.AcsRequest) { | ||||||
|  | 	readTimeout, connectTimeout := client.getTimeOut(request) | ||||||
|  | 	client.httpClient.Timeout = readTimeout | ||||||
|  | 	if trans, ok := client.httpClient.Transport.(*http.Transport); ok && trans != nil { | ||||||
|  | 		trans.DialContext = Timeout(connectTimeout) | ||||||
|  | 		client.httpClient.Transport = trans | ||||||
|  | 	} else if client.httpClient.Transport == nil { | ||||||
|  | 		client.httpClient.Transport = &http.Transport{ | ||||||
|  | 			DialContext: Timeout(connectTimeout), | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) getTimeOut(request requests.AcsRequest) (time.Duration, time.Duration) { | ||||||
|  | 	readTimeOut := defaultReadTimeout | ||||||
|  | 	connectTimeOut := defaultConnectTimeout | ||||||
|  | 
 | ||||||
|  | 	reqReadTimeout := request.GetReadTimeout() | ||||||
|  | 	reqConnectTimeout := request.GetConnectTimeout() | ||||||
|  | 	if reqReadTimeout != 0*time.Millisecond { | ||||||
|  | 		readTimeOut = reqReadTimeout | ||||||
|  | 	} else if client.readTimeout != 0*time.Microsecond { | ||||||
|  | 		readTimeOut = client.readTimeout | ||||||
|  | 	} else if client.httpClient.Timeout != 0 { | ||||||
|  | 		readTimeOut = client.httpClient.Timeout | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if reqConnectTimeout != 0*time.Microsecond { | ||||||
|  | 		connectTimeOut = reqConnectTimeout | ||||||
|  | 	} else if client.connectTimeout != 0*time.Millisecond { | ||||||
|  | 		connectTimeOut = client.connectTimeout | ||||||
|  | 	} | ||||||
|  | 	return readTimeOut, connectTimeOut | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) getHTTPSInsecure(request requests.AcsRequest) (insecure bool) { | ||||||
|  | 	if request.GetHTTPSInsecure() != nil { | ||||||
|  | 		insecure = *request.GetHTTPSInsecure() | ||||||
|  | 	} else { | ||||||
|  | 		insecure = client.GetHTTPSInsecure() | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) DoAction(request requests.AcsRequest, response responses.AcsResponse) (err error) { | ||||||
|  | 	return client.DoActionWithSigner(request, response, nil) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) { | ||||||
|  | 
 | ||||||
|  | 	httpRequest, err := client.buildRequestWithSigner(request, signer) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	client.setTimeOut(request) | ||||||
|  | 	proxy, err := client.getHttpProxy(httpRequest.URL.Scheme) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	noProxy := client.getNoProxy(httpRequest.URL.Scheme) | ||||||
|  | 	var flag bool | ||||||
|  | 	for _, value := range noProxy { | ||||||
|  | 		if strings.HasPrefix(value, "*") { | ||||||
|  | 			value = fmt.Sprint(".%s", value) | ||||||
|  | 		} | ||||||
|  | 		noProxyReg, err := regexp.Compile(value) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 		if noProxyReg.MatchString(httpRequest.Host) { | ||||||
|  | 			flag = true | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if trans, ok := client.httpClient.Transport.(*http.Transport); ok && trans != nil { | ||||||
|  | 		if trans.TLSClientConfig != nil { | ||||||
|  | 			trans.TLSClientConfig.InsecureSkipVerify = client.getHTTPSInsecure(request) | ||||||
|  | 		} else { | ||||||
|  | 			trans.TLSClientConfig = &tls.Config{ | ||||||
|  | 				InsecureSkipVerify: client.getHTTPSInsecure(request), | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if proxy != nil && !flag { | ||||||
|  | 			trans.Proxy = http.ProxyURL(proxy) | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		client.httpClient.Transport = trans | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	dump, err := httputil.DumpRequest(httpRequest, true) | ||||||
|  | 	debug("client %s", bytes.NewBuffer(dump).String()) | ||||||
|  | 
 | ||||||
|  | 	var httpResponse *http.Response | ||||||
|  | 	httpResponse, err = hookDo(client.httpClient.Do)(httpRequest) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err = responses.Unmarshal(response, httpResponse, request.GetAcceptFormat()) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) buildRequestWithSigner(request requests.AcsRequest, signer auth.Signer) (httpRequest *http.Request, err error) { | ||||||
|  | 	// init param
 | ||||||
|  | 	domain := request.GetDomain() | ||||||
|  | 	if strings.Index(domain.Default, ".") < 0 { | ||||||
|  | 		domain.Default += defaultDomain | ||||||
|  | 		request.SetDomain(domain) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if request.GetScheme() == "" { | ||||||
|  | 		request.SetScheme(client.config.Scheme) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if request.GetEnv() == "" && client.config.Env != "" { | ||||||
|  | 		request.SetEnv(client.config.Env) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err = requests.InitParam(request) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	// build signature
 | ||||||
|  | 	var finalSigner auth.Signer | ||||||
|  | 	if signer != nil { | ||||||
|  | 		finalSigner = signer | ||||||
|  | 	} else { | ||||||
|  | 		finalSigner = client.signer | ||||||
|  | 	} | ||||||
|  | 	err = auth.Sign(request, finalSigner) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// build request
 | ||||||
|  | 	requestMethod := request.GetMethod() | ||||||
|  | 	requestUrl := request.BuildUrl() | ||||||
|  | 	body := request.GetBodyReader() | ||||||
|  | 	httpRequest, err = http.NewRequest(requestMethod, requestUrl, body) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for key, val := range request.GetHeaders() { | ||||||
|  | 		httpRequest.Header[key] = []string{val} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if host, isContainsHost := request.GetHeaders()["host"]; isContainsHost { | ||||||
|  | 		httpRequest.Host = host | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	userAgent := DefaultUserAgent | ||||||
|  | 	httpRequest.Header.Set("User-Agent", userAgent) | ||||||
|  | 
 | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) getHttpProxy(scheme string) (proxy *url.URL, err error) { | ||||||
|  | 	switch scheme { | ||||||
|  | 	case "https": | ||||||
|  | 		if client.GetHttpsProxy() != "" { | ||||||
|  | 			proxy, err = url.Parse(client.httpsProxy) | ||||||
|  | 		} else if rawurl := os.Getenv("HTTPS_PROXY"); rawurl != "" { | ||||||
|  | 			proxy, err = url.Parse(rawurl) | ||||||
|  | 		} else if rawurl := os.Getenv("https_proxy"); rawurl != "" { | ||||||
|  | 			proxy, err = url.Parse(rawurl) | ||||||
|  | 		} | ||||||
|  | 	default: | ||||||
|  | 		if client.GetHttpProxy() != "" { | ||||||
|  | 			proxy, err = url.Parse(client.httpProxy) | ||||||
|  | 		} else if rawurl := os.Getenv("HTTP_PROXY"); rawurl != "" { | ||||||
|  | 			proxy, err = url.Parse(rawurl) | ||||||
|  | 		} else if rawurl := os.Getenv("http_proxy"); rawurl != "" { | ||||||
|  | 			proxy, err = url.Parse(rawurl) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (client *Client) getNoProxy(scheme string) []string { | ||||||
|  | 	var urls []string | ||||||
|  | 	if client.GetNoProxy() != "" { | ||||||
|  | 		urls = strings.Split(client.noProxy, ",") | ||||||
|  | 	} else if rawurl := os.Getenv("NO_PROXY"); rawurl != "" { | ||||||
|  | 		urls = strings.Split(rawurl, ",") | ||||||
|  | 	} else if rawurl := os.Getenv("no_proxy"); rawurl != "" { | ||||||
|  | 		urls = strings.Split(rawurl, ",") | ||||||
|  | 	} | ||||||
|  | 	return urls | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func hookDo(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) { | ||||||
|  | 	return fn | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								sdk/config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								sdk/config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | package sdk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" | ||||||
|  | 	"net/http" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Config struct { | ||||||
|  | 	Debug             bool              `default:"false"` | ||||||
|  | 	HttpTransport     *http.Transport   `default:""` | ||||||
|  | 	Transport         http.RoundTripper `default:""` | ||||||
|  | 	GoRoutinePoolSize int               `default:"0"` | ||||||
|  | 	UserAgent         string            `default:""` | ||||||
|  | 	Scheme            string            `default:"HTTP"` | ||||||
|  | 	Timeout           time.Duration     `default:"5"` | ||||||
|  | 	Env               string            `default:""` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewConfig() *Config { | ||||||
|  | 	config := &Config{} | ||||||
|  | 	utils.InitStructWithDefaultTag(config) | ||||||
|  | 	return config | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								sdk/requests/common_request.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								sdk/requests/common_request.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | package requests | ||||||
|  | 
 | ||||||
|  | import "io" | ||||||
|  | 
 | ||||||
|  | type CommonRequest struct { | ||||||
|  | 	*baseRequest | ||||||
|  | 	Product  string | ||||||
|  | 	Ontology AcsRequest | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *CommonRequest) TransToAscRequest() { | ||||||
|  | 	rpcRequest := &RpcRequest{} | ||||||
|  | 	rpcRequest.baseRequest = request.baseRequest | ||||||
|  | 	rpcRequest.product = request.Product | ||||||
|  | 	request.Ontology = rpcRequest | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *CommonRequest) BuildUrl() string { | ||||||
|  | 	return request.Ontology.BuildUrl() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *CommonRequest) BuildQueries() string { | ||||||
|  | 	return request.Ontology.BuildQueries() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *CommonRequest) GetBodyReader() io.Reader { | ||||||
|  | 	return request.Ontology.GetBodyReader() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *CommonRequest) GetStyle() string { | ||||||
|  | 	return request.Ontology.GetStyle() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *CommonRequest) InitWithApiInfo(domain Host, version, urlPath string) { | ||||||
|  | 	request.Ontology.InitWithApiInfo(domain, version, urlPath) | ||||||
|  | } | ||||||
							
								
								
									
										314
									
								
								sdk/requests/request.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										314
									
								
								sdk/requests/request.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,314 @@ | |||||||
|  | package requests | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" | ||||||
|  | 	"io" | ||||||
|  | 	"math/cmplx" | ||||||
|  | 	"reflect" | ||||||
|  | 	"strconv" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	RPC = "RPC" | ||||||
|  | 	ROA = "ROA" | ||||||
|  | 
 | ||||||
|  | 	HTTP  = "HTTP" | ||||||
|  | 	HTTPS = "HTTPS" | ||||||
|  | 
 | ||||||
|  | 	JSON = "JSON" | ||||||
|  | 	XML  = "XML" | ||||||
|  | 
 | ||||||
|  | 	DefaultHttpPort = "80" | ||||||
|  | 
 | ||||||
|  | 	GET     = "GET" | ||||||
|  | 	PUT     = "PUT" | ||||||
|  | 	POST    = "POST" | ||||||
|  | 	DELETE  = "DELETE" | ||||||
|  | 	PATCH   = "PATCH" | ||||||
|  | 	HEAD    = "HEAD" | ||||||
|  | 	OPTIONS = "OPTIONS" | ||||||
|  | 
 | ||||||
|  | 	Json = "application/json" | ||||||
|  | 	Xml  = "application/xml" | ||||||
|  | 	Raw  = "application/octet-stream" | ||||||
|  | 	Form = "application/x-www-form-urlencoded" | ||||||
|  | 
 | ||||||
|  | 	Header = "Header" | ||||||
|  | 	Query  = "Query" | ||||||
|  | 	Body   = "Body" | ||||||
|  | 	Path   = "Path" | ||||||
|  | 
 | ||||||
|  | 	TEST    = "TEST" | ||||||
|  | 	PRE     = "PRE" | ||||||
|  | 	RELEASE = "RELEASE" | ||||||
|  | 
 | ||||||
|  | 	HeaderSeparator = "\n" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Host struct { | ||||||
|  | 	Default string | ||||||
|  | 	Func    func(string) string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var debug utils.Debug | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	debug = utils.Init("request") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type AcsRequest interface { | ||||||
|  | 	GetReadTimeout() time.Duration | ||||||
|  | 	GetConnectTimeout() time.Duration | ||||||
|  | 	SetReadTimeout(readTimeOut time.Duration) | ||||||
|  | 	SetConnectTimeout(connectTimeOut time.Duration) | ||||||
|  | 	SetHTTPSInsecure(isInsecure bool) | ||||||
|  | 	GetHTTPSInsecure() *bool | ||||||
|  | 	GetQueryParams() map[string]string | ||||||
|  | 	GetFormParams() map[string]string | ||||||
|  | 	GetMethod() string | ||||||
|  | 	GetScheme() string | ||||||
|  | 	GetDomain() Host | ||||||
|  | 	SetDomain(host Host) | ||||||
|  | 	GetActionName() string | ||||||
|  | 	GetAcceptFormat() string | ||||||
|  | 	GetAccept() string | ||||||
|  | 	GetHeaders() map[string]string | ||||||
|  | 	GetStyle() string | ||||||
|  | 	InitWithApiInfo(domain Host, version, urlPath string) | ||||||
|  | 	GetEnv() string | ||||||
|  | 	SetEnv(string) | ||||||
|  | 
 | ||||||
|  | 	BuildUrl() string | ||||||
|  | 	BuildQueries() string | ||||||
|  | 
 | ||||||
|  | 	SetScheme(scheme string) | ||||||
|  | 	SetContent(content []byte) | ||||||
|  | 
 | ||||||
|  | 	SetStringToSign(stringToSign string) | ||||||
|  | 	GetStringToSign() string | ||||||
|  | 	GetBodyReader() io.Reader | ||||||
|  | 
 | ||||||
|  | 	AddHeaderParam(key, value string) | ||||||
|  | 	addQueryParam(key, value string) | ||||||
|  | 	addFormParam(key, value string) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type baseRequest struct { | ||||||
|  | 	Scheme         string | ||||||
|  | 	Method         string | ||||||
|  | 	Port           string | ||||||
|  | 	Domain         Host | ||||||
|  | 	From           string | ||||||
|  | 	ReadTimeout    time.Duration | ||||||
|  | 	ConnectTimeout time.Duration | ||||||
|  | 	isInsecure     *bool | ||||||
|  | 	Env            string | ||||||
|  | 
 | ||||||
|  | 	AcceptFormat string | ||||||
|  | 	actionName   string | ||||||
|  | 
 | ||||||
|  | 	userAgent map[string]string | ||||||
|  | 	product   string | ||||||
|  | 	version   string | ||||||
|  | 
 | ||||||
|  | 	QueryParams map[string]string | ||||||
|  | 	Headers     map[string]string | ||||||
|  | 	FormParams  map[string]string | ||||||
|  | 	Content     []byte | ||||||
|  | 
 | ||||||
|  | 	queries      string | ||||||
|  | 	stringToSign string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetEnv() string { | ||||||
|  | 	return request.Env | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetEnv(e string) { | ||||||
|  | 	request.Env = e | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetStringToSign() string { | ||||||
|  | 	return request.stringToSign | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetContent(content []byte) { | ||||||
|  | 	request.Content = content | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetAcceptFormat() string { | ||||||
|  | 	return request.AcceptFormat | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetAccept() string { | ||||||
|  | 	switch request.GetAcceptFormat() { | ||||||
|  | 	case JSON: | ||||||
|  | 		return Json | ||||||
|  | 	case XML: | ||||||
|  | 		return Xml | ||||||
|  | 	} | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetHeaders() map[string]string { | ||||||
|  | 	return request.Headers | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetActionName() string { | ||||||
|  | 	return request.actionName | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetScheme(scheme string) { | ||||||
|  | 	request.Scheme = scheme | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetDomain(host Host) { | ||||||
|  | 	request.Domain = host | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetScheme() string { | ||||||
|  | 	return request.Scheme | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetDomain() Host { | ||||||
|  | 	return request.Domain | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetMethod() string { | ||||||
|  | 	return request.Method | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetFormParams() map[string]string { | ||||||
|  | 	return request.FormParams | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetQueryParams() map[string]string { | ||||||
|  | 	return request.QueryParams | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetHTTPSInsecure(isInsecure bool) { | ||||||
|  | 	request.isInsecure = &isInsecure | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetHTTPSInsecure() *bool { | ||||||
|  | 	return request.isInsecure | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetReadTimeout() time.Duration { | ||||||
|  | 	return request.ReadTimeout | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) GetConnectTimeout() time.Duration { | ||||||
|  | 	return request.ConnectTimeout | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetReadTimeout(readTimeOut time.Duration) { | ||||||
|  | 	request.ReadTimeout = readTimeOut | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetConnectTimeout(connectTimeOut time.Duration) { | ||||||
|  | 	request.ConnectTimeout = connectTimeOut | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) SetStringToSign(stringToSign string) { | ||||||
|  | 	request.stringToSign = stringToSign | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) AddHeaderParam(key, val string) { | ||||||
|  | 	request.Headers[key] = val | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) addQueryParam(key, val string) { | ||||||
|  | 	request.QueryParams[key] = val | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *baseRequest) addFormParam(key, val string) { | ||||||
|  | 	request.FormParams[key] = val | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func defaultBaseRequest() (request *baseRequest) { | ||||||
|  | 	request = &baseRequest{ | ||||||
|  | 		Scheme:       HTTP, | ||||||
|  | 		AcceptFormat: JSON, | ||||||
|  | 		Method:       GET, | ||||||
|  | 		QueryParams:  make(map[string]string), | ||||||
|  | 		Headers: map[string]string{ | ||||||
|  | 			"Gr-Sdk-Client":      "golang/1.14", | ||||||
|  | 			"Gr-Sdk-Invoke-Type": "normal", | ||||||
|  | 			"Accept-Encoding":    Json, | ||||||
|  | 		}, | ||||||
|  | 		FormParams: make(map[string]string), | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func InitParam(request AcsRequest) (err error) { | ||||||
|  | 	reflectValue := reflect.ValueOf(request).Elem() | ||||||
|  | 	err = flatRepeatedList(reflectValue, request, "") | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func flatRepeatedList(reflectValue reflect.Value, request AcsRequest, position string) (err error) { | ||||||
|  | 	reflectType := reflectValue.Type() | ||||||
|  | 	for i := 0; i < reflectType.NumField(); i++ { | ||||||
|  | 		field := reflectType.Field(i) | ||||||
|  | 		name, isContiansNameTag := field.Tag.Lookup("field") | ||||||
|  | 
 | ||||||
|  | 		fieldPosition := position | ||||||
|  | 		if fieldPosition == "" { | ||||||
|  | 			fieldPosition, _ = field.Tag.Lookup("position") | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		fieldDefault, _ := field.Tag.Lookup("default") | ||||||
|  | 		debug("%s %s %s", name, fieldPosition, fieldDefault) | ||||||
|  | 		if isContiansNameTag { | ||||||
|  | 			var value string | ||||||
|  | 			switch field.Type.Kind() { | ||||||
|  | 			case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: | ||||||
|  | 				value = strconv.FormatInt(reflectValue.Field(i).Int(), 10) | ||||||
|  | 			case reflect.Uintptr, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: | ||||||
|  | 				value = strconv.FormatUint(reflectValue.Field(i).Uint(), 10) | ||||||
|  | 			case reflect.Float32, reflect.Float64: | ||||||
|  | 				value = strconv.FormatFloat(reflectValue.Field(i).Float(), 'E', -1, 64) | ||||||
|  | 			case reflect.Bool: | ||||||
|  | 				value = strconv.FormatBool(reflectValue.Field(i).Bool()) | ||||||
|  | 			case reflect.Complex64, reflect.Complex128: | ||||||
|  | 				value = fmt.Sprint(cmplx.Sqrt(reflectValue.Field(i).Complex())) | ||||||
|  | 			default: | ||||||
|  | 				value = reflectValue.Field(i).String() | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if len(value) == 0 { | ||||||
|  | 				value = fieldDefault | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if value == "0" && fieldDefault != "" && fieldDefault != "0" { | ||||||
|  | 				value = fieldDefault | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			err = addParam(request, fieldPosition, name, value) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func addParam(request AcsRequest, position, key, value string) (err error) { | ||||||
|  | 	if len(value) > 0 { | ||||||
|  | 		switch position { | ||||||
|  | 		case Header: | ||||||
|  | 			request.AddHeaderParam(key, value) | ||||||
|  | 		case Query: | ||||||
|  | 			request.addQueryParam(key, value) | ||||||
|  | 		case Body: | ||||||
|  | 			request.addFormParam(key, value) | ||||||
|  | 		default: | ||||||
|  | 			errmsg := fmt.Sprintf("unsupport positions add param `%s`", position) | ||||||
|  | 			err = errors.New(errmsg) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										63
									
								
								sdk/requests/rpc_request.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								sdk/requests/rpc_request.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | package requests | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/utils" | ||||||
|  | 	"io" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type RpcRequest struct { | ||||||
|  | 	*baseRequest | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *RpcRequest) init() { | ||||||
|  | 	request.baseRequest = defaultBaseRequest() | ||||||
|  | 	request.Method = POST | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *RpcRequest) BuildUrl() string { | ||||||
|  | 
 | ||||||
|  | 	var hostname string | ||||||
|  | 	if request.Domain.Func == nil { | ||||||
|  | 		hostname = request.Domain.Default | ||||||
|  | 	} else if hostname = request.Domain.Func(request.GetEnv()); hostname == "" { | ||||||
|  | 		hostname = request.Domain.Default | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	url := fmt.Sprintf("%s://%s", strings.ToLower(request.Scheme), hostname) | ||||||
|  | 	if len(request.Port) > 0 { | ||||||
|  | 		url = fmt.Sprintf("%s:%s", url, request.Port) | ||||||
|  | 	} | ||||||
|  | 	return url + request.BuildQueries() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *RpcRequest) GetStyle() string { | ||||||
|  | 	return RPC | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *RpcRequest) BuildQueries() string { | ||||||
|  | 	path := strings.TrimLeft(strings.TrimSpace(request.GetActionName()), "/") | ||||||
|  | 	request.queries = "/" + path + "?" + utils.GetUrlFormedMap(request.QueryParams) | ||||||
|  | 	return request.queries | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *RpcRequest) GetActionName() string { | ||||||
|  | 	return request.actionName | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *RpcRequest) InitWithApiInfo(domain Host, version, urlPath string) { | ||||||
|  | 	request.init() | ||||||
|  | 	request.SetDomain(domain) | ||||||
|  | 	request.version = version | ||||||
|  | 	request.actionName = urlPath | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (request *RpcRequest) GetBodyReader() io.Reader { | ||||||
|  | 	if request.FormParams != nil && len(request.FormParams) > 0 { | ||||||
|  | 		formString := utils.GetUrlFormedMap(request.FormParams) | ||||||
|  | 		return strings.NewReader(formString) | ||||||
|  | 	} else { | ||||||
|  | 		return strings.NewReader("") | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								sdk/requests/types.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								sdk/requests/types.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | |||||||
|  | package requests | ||||||
|  | 
 | ||||||
|  | import "strconv" | ||||||
|  | 
 | ||||||
|  | type Interger string | ||||||
|  | 
 | ||||||
|  | func (i Interger) ToInt() int { | ||||||
|  | 	a, _ := strconv.ParseInt(string(i), 10, 64) | ||||||
|  | 	return int(a) | ||||||
|  | } | ||||||
							
								
								
									
										117
									
								
								sdk/responses/response.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										117
									
								
								sdk/responses/response.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,117 @@ | |||||||
|  | package responses | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"errors" | ||||||
|  | 	"fmt" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"io/ioutil" | ||||||
|  | 	"net/http" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type AcsResponse interface { | ||||||
|  | 	IsSuccess() bool | ||||||
|  | 	GetHttpStatus() int | ||||||
|  | 	GetHttpHeaders() map[string][]string | ||||||
|  | 	GetHttpContentString() string | ||||||
|  | 	GetHttpContentBytes() []byte | ||||||
|  | 	GetOriginHttpResponse() *http.Response | ||||||
|  | 	parseFromHttpResponse(httpResponse *http.Response) error | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type BaseResponse struct { | ||||||
|  | 	httpStatus         int | ||||||
|  | 	httpHeaders        map[string][]string | ||||||
|  | 	httpContentString  string | ||||||
|  | 	httpContentBytes   []byte | ||||||
|  | 	originHttpResponse *http.Response | ||||||
|  | 
 | ||||||
|  | 	Code   int    `json:"code"` | ||||||
|  | 	Status bool   `json:"status"` | ||||||
|  | 	Msg    string `json:"msg"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseResponse *BaseResponse) GetHttpStatus() int { | ||||||
|  | 	return baseResponse.httpStatus | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseResponse *BaseResponse) GetHttpHeaders() map[string][]string { | ||||||
|  | 	return baseResponse.httpHeaders | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseResponse *BaseResponse) GetHttpContentString() string { | ||||||
|  | 	return baseResponse.httpContentString | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseResponse *BaseResponse) GetHttpContentBytes() []byte { | ||||||
|  | 	return baseResponse.httpContentBytes | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseResponse *BaseResponse) GetOriginHttpResponse() *http.Response { | ||||||
|  | 	return baseResponse.originHttpResponse | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseResponse *BaseResponse) IsSuccess() bool { | ||||||
|  | 	if baseResponse.GetHttpStatus() >= 200 && baseResponse.GetHttpStatus() < 300 { | ||||||
|  | 		return true | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (baseResponse *BaseResponse) parseFromHttpResponse(httpResponse *http.Response) (err error) { | ||||||
|  | 	defer httpResponse.Body.Close() | ||||||
|  | 	body, err := ioutil.ReadAll(httpResponse.Body) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	baseResponse.httpStatus = httpResponse.StatusCode | ||||||
|  | 	baseResponse.httpHeaders = httpResponse.Header | ||||||
|  | 	baseResponse.httpContentBytes = body | ||||||
|  | 	baseResponse.httpContentString = string(body) | ||||||
|  | 	baseResponse.originHttpResponse = httpResponse | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type CommonResponse struct { | ||||||
|  | 	*BaseResponse | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewCommonResponse() (response *CommonResponse) { | ||||||
|  | 	return &CommonResponse{ | ||||||
|  | 		BaseResponse: &BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func Unmarshal(response AcsResponse, httpResponse *http.Response, format string) (err error) { | ||||||
|  | 	err = response.parseFromHttpResponse(httpResponse) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if _, isCommonResponse := response.(CommonResponse); isCommonResponse { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if !response.IsSuccess() { | ||||||
|  | 		if contentType, ok := response.GetHttpHeaders()["Content-Type"]; ok { | ||||||
|  | 			for _, v := range contentType { | ||||||
|  | 				if strings.Contains(v, requests.Json) { | ||||||
|  | 					json.Unmarshal(response.GetHttpContentBytes(), response) | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		err = errors.New(fmt.Sprintf("%d %s", response.GetHttpStatus(), response.GetHttpContentString())) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if format != "xml" { | ||||||
|  | 		err = json.Unmarshal(response.GetHttpContentBytes(), response) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return errors.New("json Unmarshal:" + err.Error()) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								sdk/utils/debug.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								sdk/utils/debug.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | package utils | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"os" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Debug func(format string, v ...interface{}) | ||||||
|  | 
 | ||||||
|  | var hookPrint = func(input string) { | ||||||
|  | 	fmt.Println(input) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 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 { | ||||||
|  | 			hookPrint(fmt.Sprintf(format, v...)) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										111
									
								
								sdk/utils/utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								sdk/utils/utils.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,111 @@ | |||||||
|  | package utils | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/md5" | ||||||
|  | 	"crypto/rand" | ||||||
|  | 	"encoding/hex" | ||||||
|  | 	"fmt" | ||||||
|  | 	"hash" | ||||||
|  | 	rand2 "math/rand" | ||||||
|  | 	"net/url" | ||||||
|  | 	"reflect" | ||||||
|  | 	"sort" | ||||||
|  | 	"strconv" | ||||||
|  | 	"strings" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type UUID [16]byte | ||||||
|  | 
 | ||||||
|  | const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" | ||||||
|  | 
 | ||||||
|  | func GetUUID() (uuidHex string) { | ||||||
|  | 	uuid := NewUUID() | ||||||
|  | 	uuidHex = hex.EncodeToString(uuid[:]) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewUUID() UUID { | ||||||
|  | 	ns := UUID{} | ||||||
|  | 	safeRandom(ns[:]) | ||||||
|  | 	u := newFromHash(md5.New(), ns, RandStringBytes(16)) | ||||||
|  | 	u[6] = (u[6] & 0x0f) | (byte(2) << 4) | ||||||
|  | 	u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) | ||||||
|  | 
 | ||||||
|  | 	return u | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func RandStringBytes(n int) string { | ||||||
|  | 	b := make([]byte, n) | ||||||
|  | 	for i := range b { | ||||||
|  | 		b[i] = letterBytes[rand2.Intn(len(letterBytes))] | ||||||
|  | 	} | ||||||
|  | 	return string(b) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func newFromHash(h hash.Hash, ns UUID, name string) UUID { | ||||||
|  | 	u := UUID{} | ||||||
|  | 	h.Write(ns[:]) | ||||||
|  | 	h.Write([]byte(name)) | ||||||
|  | 	copy(u[:], h.Sum(nil)) | ||||||
|  | 
 | ||||||
|  | 	return u | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func safeRandom(dest []byte) { | ||||||
|  | 	if _, err := rand.Read(dest); err != nil { | ||||||
|  | 		panic(err) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetUrlFormedMap(source map[string]string) (urlEncoded string) { | ||||||
|  | 	urlEncoder := url.Values{} | ||||||
|  | 	for key, value := range source { | ||||||
|  | 		urlEncoder.Add(key, value) | ||||||
|  | 	} | ||||||
|  | 	urlEncoded = urlEncoder.Encode() | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetUrlByKeySort(source map[string]string) (url string) { | ||||||
|  | 	keys := make([]string, 0, len(source)) | ||||||
|  | 	for k := range source { | ||||||
|  | 		keys = append(keys, k) | ||||||
|  | 	} | ||||||
|  | 	sort.Strings(keys) | ||||||
|  | 	for _, key := range keys { | ||||||
|  | 		url += fmt.Sprintf("%s=%s&", key, source[key]) | ||||||
|  | 	} | ||||||
|  | 	return strings.TrimRight(url, "&") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func InitStructWithDefaultTag(bean interface{}) { | ||||||
|  | 	beantype := reflect.TypeOf(bean) | ||||||
|  | 	for i := 0; i < beantype.Elem().NumField(); i++ { | ||||||
|  | 		field := beantype.Elem().Field(i) | ||||||
|  | 		defaultValue := strings.TrimSpace(field.Tag.Get("default")) | ||||||
|  | 		if defaultValue == "" || defaultValue == "-" { | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 		setter := reflect.ValueOf(bean).Elem().Field(i) | ||||||
|  | 		fieldTypeName := field.Type.String() | ||||||
|  | 		switch fieldTypeName { | ||||||
|  | 		case "int", "int64", "int32", "int8", "int16": | ||||||
|  | 			intval, _ := strconv.ParseInt(defaultValue, 10, 64) | ||||||
|  | 			setter.SetInt(intval) | ||||||
|  | 		case "uint", "uint8", "uint16", "uint32", "uint64", "uintptr": | ||||||
|  | 			uintval, _ := strconv.ParseUint(defaultValue, 10, 64) | ||||||
|  | 			setter.SetUint(uintval) | ||||||
|  | 		case "string": | ||||||
|  | 			setter.SetString(defaultValue) | ||||||
|  | 		case "time.Duration": | ||||||
|  | 			intval, _ := strconv.ParseInt(defaultValue, 10, 64) | ||||||
|  | 			setter.SetInt(intval * int64(time.Second)) | ||||||
|  | 		case "bool": | ||||||
|  | 			boolval, _ := strconv.ParseBool(defaultValue) | ||||||
|  | 			setter.SetBool(boolval) | ||||||
|  | 		default: | ||||||
|  | 			fmt.Println(field.Type.String(), field.Name) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								sdk/utils/utils_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								sdk/utils/utils_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | package utils | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"net/http" | ||||||
|  | 	"testing" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type TestCase struct { | ||||||
|  | 	Debug             bool              `default:"false"` | ||||||
|  | 	HttpTransport     *http.Transport   `default:""` | ||||||
|  | 	Transport         http.RoundTripper `default:""` | ||||||
|  | 	GoRoutinePoolSize int               `default:"5"` | ||||||
|  | 	UserAgent         string            `default:""` | ||||||
|  | 	Scheme            string            `default:"HTTP"` | ||||||
|  | 	Haha              uintptr           `default:"232"` | ||||||
|  | 	Timeout           time.Duration     `default:"5"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestInitStructWithDefaultTag(t *testing.T) { | ||||||
|  | 	testcase := &TestCase{} | ||||||
|  | 	InitStructWithDefaultTag(testcase) | ||||||
|  | 	fmt.Printf("%+v", testcase) | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								services/apk/add_apk.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								services/apk/add_apk.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | package apk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type AddApkRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	List string `position:"Body" field:"list" default:"[]" ` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type AddApkResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Code   int    `json:"code"` | ||||||
|  | 	Status bool   `json:"status"` | ||||||
|  | 	Msg    string `json:"msg"` | ||||||
|  | 	Data   struct { | ||||||
|  | 		Count int `json:"count"` | ||||||
|  | 	} `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateAddApkRequest() (req *AddApkRequest) { | ||||||
|  | 	req = &AddApkRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/apk/add") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateAddApkResponse() (response *AddApkResponse) { | ||||||
|  | 	response = &AddApkResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								services/apk/add_top.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								services/apk/add_top.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | package apk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type AddTopRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	Id  int    `position:"Body" field:"id" default:"0" ` | ||||||
|  | 	Ids string `position:"Body" field:"ids" default:"" ` | ||||||
|  | 	Top int    `position:"Body" field:"top" default:"0"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type AddTopResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Code   int    `json:"code"` | ||||||
|  | 	Status bool   `json:"status"` | ||||||
|  | 	Msg    string `json:"msg"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateAddTopRequest() (req *AddTopRequest) { | ||||||
|  | 	req = &AddTopRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/apk/AddTop") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateAddTopResponse() (response *AddTopResponse) { | ||||||
|  | 	response = &AddTopResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										66
									
								
								services/apk/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								services/apk/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | |||||||
|  | package apk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	VERSION = "2021-07-30" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var HOST requests.Host = requests.Host{ | ||||||
|  | 	Default: "c.api.gaore.com", | ||||||
|  | 	Func: func(s string) string { | ||||||
|  | 		var a = map[string]string{ | ||||||
|  | 			requests.RELEASE: "c.api.gaore.com", | ||||||
|  | 			requests.PRE:     "c.api.gaore.com", | ||||||
|  | 			requests.TEST:    "c.api.gaore.com", | ||||||
|  | 		} | ||||||
|  | 		return a[s] | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClient() (client *Client) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	client.InitWithAccessKey("", "", "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 打包任务添加优先级
 | ||||||
|  | func (c *Client) AddApkTop(req *AddTopRequest) (response *AddTopResponse, err error) { | ||||||
|  | 	response = CreateAddTopResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 添加打包任务
 | ||||||
|  | func (c *Client) AddApk(req *AddApkRequest) (response *AddApkResponse, err error) { | ||||||
|  | 	response = CreateAddApkResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 清除cdn
 | ||||||
|  | func (c *Client) RefreshApkR(req *RefreshApkRequest) (response *RefreshApkResponse, err error) { | ||||||
|  | 	response = CreateRefreshApkResponse() | ||||||
|  | 	if len(req.CdnUrlArray) > 0 { | ||||||
|  | 		cdnurls, _ := json.Marshal(req.CdnUrlArray) | ||||||
|  | 		req.cdnUrls = string(cdnurls) | ||||||
|  | 	} | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 获取打包日志
 | ||||||
|  | func (c *Client) SearchApk(req *SearchApkRequest) (response *SearchApkResponse, err error) { | ||||||
|  | 	response = CreateSearchApkResponse() | ||||||
|  | 
 | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										21
									
								
								services/apk/client_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								services/apk/client_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,21 @@ | |||||||
|  | package apk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"testing" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestClient_GetUserInfo(t *testing.T) { | ||||||
|  | 	c := NewClient() | ||||||
|  | 	req := CreateSearchApkRequest() | ||||||
|  | 	req.GameIds = "3503" | ||||||
|  | 	req.Ver = "1.0.0" | ||||||
|  | 	req.SetReadTimeout(60 * time.Second) | ||||||
|  | 	resp, err := c.SearchApk(req) | ||||||
|  | 
 | ||||||
|  | 	fmt.Println(req) | ||||||
|  | 	fmt.Println(resp.GetHttpContentString()) | ||||||
|  | 	fmt.Println(err) | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								services/apk/refresh_apk.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								services/apk/refresh_apk.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | package apk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type RefreshApkRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	cdnUrls     string `position:"Body" field:"cdn_urls" default:"[]" ` | ||||||
|  | 	CdnUrlArray []string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type RefreshApkResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Code   int               `json:"code"` | ||||||
|  | 	Status bool              `json:"status"` | ||||||
|  | 	Msg    string            `json:"msg"` | ||||||
|  | 	Data   map[string]string `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateRefreshApkRequest() (req *RefreshApkRequest) { | ||||||
|  | 	req = &RefreshApkRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/apk/refresh") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateRefreshApkResponse() (response *RefreshApkResponse) { | ||||||
|  | 	response = &RefreshApkResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										74
									
								
								services/apk/search_apk.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								services/apk/search_apk.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,74 @@ | |||||||
|  | package apk | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SearchApkRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	StartTime string `position:"Body" field:"startTime" default:"" ` | ||||||
|  | 	EndTime   string `position:"Body" field:"endTime" default:"" ` | ||||||
|  | 	State     string `position:"Body" field:"state" default:"" ` | ||||||
|  | 	SiteIds   string `position:"Body" field:"siteIds" default:"" ` | ||||||
|  | 	Ver       string `position:"Body" field:"ver" default:"" ` | ||||||
|  | 	SiteId    int    `position:"Body" field:"siteId" default:"" ` | ||||||
|  | 	AgentId   int    `position:"Body" field:"agentId" default:"" ` | ||||||
|  | 	Top       int    `position:"Body" field:"top" default:"" ` | ||||||
|  | 	GameIds   string `position:"Body" field:"gameIds" default:"" ` | ||||||
|  | 	Autor     string `position:"Body" field:"autor" default:"" ` | ||||||
|  | 	Page      int    `position:"Body" field:"page" default:"1" ` | ||||||
|  | 	Pagesize  int    `position:"Body" field:"pagesize" default:"20" ` | ||||||
|  | 	Order     string `position:"Body" field:"order" default:"" ` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type ApkLog struct { | ||||||
|  | 	ID          int       `json:"Id"` | ||||||
|  | 	GameID      int       `json:"GameId"` | ||||||
|  | 	GameName    string    `json:"GameName"` | ||||||
|  | 	Ver         string    `json:"Ver"` | ||||||
|  | 	Top         int       `json:"Top"` | ||||||
|  | 	AgentID     int       `json:"AgentId"` | ||||||
|  | 	SiteID      int       `json:"SiteId"` | ||||||
|  | 	Addtime     time.Time `json:"Addtime"` | ||||||
|  | 	Edittime    time.Time `json:"Edittime"` | ||||||
|  | 	State       int       `json:"State"` | ||||||
|  | 	Times       int       `json:"Times"` | ||||||
|  | 	ReleaseTime int       `json:"ReleaseTime"` | ||||||
|  | 	Env         int       `json:"Env"` | ||||||
|  | 	AliOss      int       `json:"AliOss"` | ||||||
|  | 	NeedCdn     bool      `json:"NeedCdn"` | ||||||
|  | 	Autor       string    `json:"Autor"` | ||||||
|  | 	Ext         string    `json:"Ext"` | ||||||
|  | 	IsAugment   bool      `json:"IsAugment"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SearchApkResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Code   int    `json:"code"` | ||||||
|  | 	Status bool   `json:"status"` | ||||||
|  | 	Msg    string `json:"msg"` | ||||||
|  | 	Data   struct { | ||||||
|  | 		Page     int      `json:"Page"` | ||||||
|  | 		PageSize int      `json:"PageSize"` | ||||||
|  | 		Total    int      `json:"Total"` | ||||||
|  | 		List     []ApkLog `json:"List"` | ||||||
|  | 	} `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSearchApkRequest() (req *SearchApkRequest) { | ||||||
|  | 	req = &SearchApkRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/apk/list") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSearchApkResponse() (response *SearchApkResponse) { | ||||||
|  | 	response = &SearchApkResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								services/callback/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								services/callback/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | package callback | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	VERSION = "2021-11-30" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var HOST requests.Host = requests.Host{ | ||||||
|  | 	Default: "callback.api.gaore.com", | ||||||
|  | 	Func: func(s string) string { | ||||||
|  | 		var a = map[string]string{ | ||||||
|  | 			requests.RELEASE: "callback.api.gaore.com", | ||||||
|  | 			requests.PRE:     "callback.api.gaore.com", | ||||||
|  | 			requests.TEST:    "callback.api.gaore.com", | ||||||
|  | 		} | ||||||
|  | 		return a[s] | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClient() (client *Client) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	client.InitWithAccessKey("", "", "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 上报关键行为
 | ||||||
|  | func (c *Client) SendAction(req *SendActionRequest) (response *SendActionResponse, err error) { | ||||||
|  | 	response = CreateSendActionResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 上报激活
 | ||||||
|  | func (c *Client) SendActive() { | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // 上报付费
 | ||||||
|  | 
 | ||||||
|  | // 上报注册
 | ||||||
							
								
								
									
										49
									
								
								services/callback/send_action.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								services/callback/send_action.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | package callback | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const OS_ANDROID = 2 | ||||||
|  | 
 | ||||||
|  | const OS_IOS = 1 | ||||||
|  | 
 | ||||||
|  | type SendActionRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	GameId      int64  `position:"Query" field:"game_id" default:"" ` | ||||||
|  | 	AgentId     int64  `position:"Query" field:"agent_id" default:"" ` | ||||||
|  | 	SiteId      int64  `position:"Query" field:"site_id" default:"" ` | ||||||
|  | 	Imei        string `position:"Query" field:"imei" default:"" ` | ||||||
|  | 	Oaid        string `position:"Query" field:"oaid" default:"" ` | ||||||
|  | 	Ip          string `position:"Query" field:"ip" default:"" ` | ||||||
|  | 	Ua          string `position:"Query" field:"ua" default:"" ` | ||||||
|  | 	Os          int    `position:"Query" field:"os" default:"" ` | ||||||
|  | 	ParamsArray []string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SendActionResponseData struct { | ||||||
|  | 	Account string `json:"account"` | ||||||
|  | 	Total   int    `json:"total"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SendActionResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Data SendActionResponseData `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSendActionRequest() (req *SendActionRequest) { | ||||||
|  | 	req = &SendActionRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/callback/ads_callback/sendAction") | ||||||
|  | 	req.Method = requests.GET | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSendActionResponse() (response *SendActionResponse) { | ||||||
|  | 	response = &SendActionResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										29
									
								
								services/jedi/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								services/jedi/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### 发送短信调用示例  | ||||||
|  | ```go  | ||||||
|  | import ( | ||||||
|  |     "fmt" | ||||||
|  |     "golib.gaore.com/GaoreGo/gaore-common-sdk-go/services/jedi" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func main() { | ||||||
|  |     c, err := jedi.NewClientWithAccessKey("accessKeyId", "accessKeySecret", "xxx.xxx.com") | ||||||
|  |     if err != nil { | ||||||
|  |         return | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     req := jedi.CreateSendSmsRequest() | ||||||
|  |     // sso统一用户名uid, 多个用户用逗句隔开 | ||||||
|  |     req.User = "liangzy,liaoks" | ||||||
|  |     // 公共模板的代码模板 | ||||||
|  |     req.Code = "d7kt5IwP" | ||||||
|  |     // 模板参数,模板里有多少个模板参数就传入几个替换字符串, | ||||||
|  |     req.ParamsArray = []string{"www", "线上", "好人"} | ||||||
|  |     if resp, err := c.SendSms(req); err == nil { | ||||||
|  |         grlogs.Informational(fmt.Sprintf("%+v", resp.GetHttpContentString())) | ||||||
|  |     } else { | ||||||
|  |         grlogs.Error(err) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | ``` | ||||||
							
								
								
									
										48
									
								
								services/jedi/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								services/jedi/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | package jedi | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	VERSION = "2020-09-24" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var HOST requests.Host = requests.Host{ | ||||||
|  | 	Default: "jedi.api.gaore.com", | ||||||
|  | 	Func: func(s string) string { | ||||||
|  | 		var a = map[string]string{ | ||||||
|  | 			requests.RELEASE: "jedi.api.gaore.com", | ||||||
|  | 			requests.PRE:     "jedi.api.gaore.com", | ||||||
|  | 			requests.TEST:    "jedi.oapi.gaore.com", | ||||||
|  | 		} | ||||||
|  | 		return a[s] | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) SendSms(req *SendSmsRequest) (response *SendSmsResponse, err error) { | ||||||
|  | 	if req.ParamsArray != nil && len(req.ParamsArray) > 0 { | ||||||
|  | 		req.Params = strings.Join(req.ParamsArray, ",,,") | ||||||
|  | 	} | ||||||
|  | 	response = CreateSendSmsResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	err = client.InitWithAccessKey(accesskey, secrect, source) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClientWithAliAppcode(accesskey, secrect string, env ...string) (client *Client, err error) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	err = client.InitWithAliAppcode(accesskey, secrect, env...) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								services/jedi/send_sms.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								services/jedi/send_sms.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | |||||||
|  | package jedi | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SendSmsRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	User        string `position:"Body" field:"user" default:"" ` | ||||||
|  | 	Code        string `position:"Body" field:"code" default:"" ` | ||||||
|  | 	Params      string `position:"Body" field:"params" default:"" ` | ||||||
|  | 	ParamsArray []string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SendSmsResponseData struct { | ||||||
|  | 	Account string `json:"account"` | ||||||
|  | 	Total   int    `json:"total"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SendSmsResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Data SendSmsResponseData `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSendSmsRequest() (req *SendSmsRequest) { | ||||||
|  | 	req = &SendSmsRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/sms/send") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSendSmsResponse() (response *SendSmsResponse) { | ||||||
|  | 	response = &SendSmsResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										50
									
								
								services/mail/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								services/mail/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | |||||||
|  | package mail | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"crypto/md5" | ||||||
|  | 	"fmt" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	VERSION = "2021-09-27" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var HOST requests.Host = requests.Host{ | ||||||
|  | 	Default: "mail.gaore.com", | ||||||
|  | 	Func: func(s string) string { | ||||||
|  | 		var a = map[string]string{ | ||||||
|  | 			requests.RELEASE: "mail.gaore.com", | ||||||
|  | 			requests.PRE:     "mail.gaore.com", | ||||||
|  | 			requests.TEST:    "mail.gaore.com", | ||||||
|  | 		} | ||||||
|  | 		return a[s] | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClient() (client *Client) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	client.InitWithAccessKey("", "", "") | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) SendEmail(req *PostEmailRequest) (response *PostEmailResponse, err error) { | ||||||
|  | 
 | ||||||
|  | 	now := time.Now().Second() | ||||||
|  | 	key := "04573fc4c8e01999a0909ab9c00bca5a" | ||||||
|  | 	signstr := fmt.Sprintf("%d%s", now, key) | ||||||
|  | 	data := []byte(signstr) | ||||||
|  | 	has := md5.Sum(data) | ||||||
|  | 	sign := fmt.Sprintf("%x", has) | ||||||
|  | 	req.Time = now | ||||||
|  | 	req.Sign = sign | ||||||
|  | 	response = CreatePostEmailResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										22
									
								
								services/mail/client_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								services/mail/client_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | package mail | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"testing" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestClient_GetUserInfo(t *testing.T) { | ||||||
|  | 	c := NewClient() | ||||||
|  | 	req := CreatePostEmailRequest() | ||||||
|  | 	req.Addresses = "3002467428@qq.com" | ||||||
|  | 	req.Body = "1111" | ||||||
|  | 	req.FromName = "213123121" | ||||||
|  | 	req.SetReadTimeout(60 * time.Second) | ||||||
|  | 	resp, err := c.SendEmail(req) | ||||||
|  | 
 | ||||||
|  | 	fmt.Println(req) | ||||||
|  | 	fmt.Println(resp.GetHttpContentString()) | ||||||
|  | 	fmt.Println(err) | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								services/mail/end_email.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								services/mail/end_email.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | package mail | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type PostEmailRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	Addresses string `position:"Body" field:"addresses" default:"" ` | ||||||
|  | 	Subject   string `position:"Body" field:"subject" default:"" ` | ||||||
|  | 	Body      string `position:"Body" field:"body" default:""` | ||||||
|  | 	FromName  string `position:"Body" field:"fromName" default:""` | ||||||
|  | 	Time      int    `position:"Body" field:"time" default:""` | ||||||
|  | 	Sign      string `position:"Body" field:"sign" default:""` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type PostEmailResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreatePostEmailRequest() (req *PostEmailRequest) { | ||||||
|  | 	req = &PostEmailRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/email/post_email.php") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreatePostEmailResponse() (response *PostEmailResponse) { | ||||||
|  | 	response = &PostEmailResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								services/mkt/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								services/mkt/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | package mkt | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	VERSION = "2020-11-16" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var HOST = requests.Host{ | ||||||
|  | 	Default: "mkt", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PkgNotice 打包通知
 | ||||||
|  | func (c *Client) PkgNotice(req *PkgNoticeRequest) (response *PkgNoticeResponse, err error) { | ||||||
|  | 	response = CreatePkgNoticeResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	err = client.InitWithAccessKey(accesskey, secrect, source) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								services/mkt/pkg_notice.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								services/mkt/pkg_notice.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,36 @@ | |||||||
|  | package mkt | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // PkgNoticeRequest 打包通知请求信息
 | ||||||
|  | type PkgNoticeRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	SiteID int64 `position:"Body" field:"site_id"` // 广告位ID
 | ||||||
|  | 	Status int   `position:"Body" field:"status"`  // 打包状态(0:失败 1:成功)
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // PkgNoticeResponse 打包通知响应信息
 | ||||||
|  | type PkgNoticeResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CreatePkgNoticeRequest 创建通知接口
 | ||||||
|  | func CreatePkgNoticeRequest() (req *PkgNoticeRequest) { | ||||||
|  | 	req = &PkgNoticeRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/game/pkgnotice") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // CreatePkgNoticeResponse 创建通知响应
 | ||||||
|  | func CreatePkgNoticeResponse() (response *PkgNoticeResponse) { | ||||||
|  | 	response = &PkgNoticeResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										48
									
								
								services/sso/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								services/sso/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | |||||||
|  | package sso | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	VERSION = "2020-08-07" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var HOST = requests.Host{ | ||||||
|  | 	Default: "sso", | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) CodeAuth(req *CodeAuthRequest) (response *CodeAuthResponse, err error) { | ||||||
|  | 	response = CreateCodeAuthResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) GetUserInfo(req *GetUserInfoRequest) (response *GetUserInfoResponse, err error) { | ||||||
|  | 	response = CreateGetUserInfoResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) RefreshToken(req *RefreshTokenRequest) (response *RefreshTokenResponse, err error) { | ||||||
|  | 	response = CreateRefreshTokenResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) SearchUser(req *SearchUserRequest) (response *SearchUserResponse, err error) { | ||||||
|  | 	response = CreateSearchUserResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	err = client.InitWithAccessKey(accesskey, secrect, source) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										39
									
								
								services/sso/code_auth.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								services/sso/code_auth.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | package sso | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type CodeAuthRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	OauthCode string `position:"Body" field:"oauthCode" default:"" ` | ||||||
|  | 	Ident     string `position:"Body" field:"ident" default:"" ` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type CodeAuthResponseData struct { | ||||||
|  | 	RefreshToken        string `json:"refreshToken"` | ||||||
|  | 	RefreshTokenExpires int64  `json:"refreshTokenExpires"` | ||||||
|  | 	Token               string `json:"token"` | ||||||
|  | 	TokenExpires        int64  `json:"tokenExpires"` | ||||||
|  | 	User                User   `json:"user"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type CodeAuthResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Data CodeAuthResponseData `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateCodeAuthRequest() (req *CodeAuthRequest) { | ||||||
|  | 	req = &CodeAuthRequest{RpcRequest: &requests.RpcRequest{}} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/userSess/codeAuth") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateCodeAuthResponse() (response *CodeAuthResponse) { | ||||||
|  | 	response = &CodeAuthResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										35
									
								
								services/sso/get_user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								services/sso/get_user.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | |||||||
|  | package sso | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type GetUserInfoRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	Token string `position:"Body" field:"token" default:"" ` | ||||||
|  | 	Ident string `position:"Body" field:"ident" default:"" ` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type GetUserInfoResponseData struct { | ||||||
|  | 	User User `json:"user"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type GetUserInfoResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Data GetUserInfoResponseData `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateGetUserInfoRequest() (req *GetUserInfoRequest) { | ||||||
|  | 	req = &GetUserInfoRequest{RpcRequest: &requests.RpcRequest{}} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/userSess/getUserInfo") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateGetUserInfoResponse() (response *GetUserInfoResponse) { | ||||||
|  | 	response = &GetUserInfoResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								services/sso/refresh_token.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								services/sso/refresh_token.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,37 @@ | |||||||
|  | package sso | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type RefreshTokenRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	RefreshToken string `position:"Body" field:"refreshToken" default:"" ` | ||||||
|  | 	Ident        string `position:"Body" field:"ident" default:"" ` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type RefreshTokenResponseData struct { | ||||||
|  | 	Token        string `json:"token"` | ||||||
|  | 	TokenExpires int64  `json:"tokenExpires"` | ||||||
|  | 	User         User   `json:"user"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type RefreshTokenResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Data GetUserInfoResponseData `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateRefreshTokenRequest() (req *RefreshTokenRequest) { | ||||||
|  | 	req = &RefreshTokenRequest{RpcRequest: &requests.RpcRequest{}} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/userSess/refreshToken") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateRefreshTokenResponse() (response *RefreshTokenResponse) { | ||||||
|  | 	response = &RefreshTokenResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										34
									
								
								services/sso/search_user.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								services/sso/search_user.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | package sso | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type SearchUserRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	Uid string `position:"Body" field:"uid" default:"" ` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SearchUserResponseData struct { | ||||||
|  | 	User User `json:"user"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type SearchUserResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Data SearchUserResponseData `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSearchUserRequest() (req *SearchUserRequest) { | ||||||
|  | 	req = &SearchUserRequest{RpcRequest: &requests.RpcRequest{}} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/user/search") | ||||||
|  | 	req.Method = requests.POST | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateSearchUserResponse() (response *SearchUserResponse) { | ||||||
|  | 	response = &SearchUserResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										27
									
								
								services/sso/struct.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								services/sso/struct.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,27 @@ | |||||||
|  | package sso | ||||||
|  | 
 | ||||||
|  | type User struct { | ||||||
|  | 	Uid        string     `json:"uid"` | ||||||
|  | 	UidNumber  string     `json:"uidNumber"` | ||||||
|  | 	Name       string     `json:"name"` | ||||||
|  | 	FirstName  string     `json:"firstname"` | ||||||
|  | 	LastName   string     `json:"lastname"` | ||||||
|  | 	RealName   string     `json:"realname"` | ||||||
|  | 	Mobile     string     `json:"mobile"` | ||||||
|  | 	Mail       string     `json:"mail"` | ||||||
|  | 	Department Department `json:"department"` | ||||||
|  | 	Roles      []Role     `json:"roles"` | ||||||
|  | 	Domains    []string   `json:"domains"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Department struct { | ||||||
|  | 	Gid  string `json:"gid"` | ||||||
|  | 	Name string `json:"name"` | ||||||
|  | 	Abbr string `json:"abbr"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Role struct { | ||||||
|  | 	Name    string   `json:"name"` | ||||||
|  | 	Domains []string `json:"domains"` | ||||||
|  | 	Abbr    string   `json:"abbr"` | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								services/www/client.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								services/www/client.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | |||||||
|  | package www | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	VERSION = "2020-09-24" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var HOST requests.Host = requests.Host{ | ||||||
|  | 	Default: "apisdk.9ooo.cn", | ||||||
|  | 	Func: func(s string) string { | ||||||
|  | 		var a = map[string]string{ | ||||||
|  | 			requests.RELEASE: "apisdk.9ooo.cn", | ||||||
|  | 			requests.PRE:     "apisdk.9ooo.cn", | ||||||
|  | 			requests.TEST:    "apisdk.9ooo.cn", | ||||||
|  | 		} | ||||||
|  | 		return a[s] | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type Client struct { | ||||||
|  | 	sdk.Client | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClientWithAccessKey(accesskey, secrect, source string) (client *Client, err error) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	err = client.InitWithAccessKey(accesskey, secrect, source) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewClientWithAliAppcode(accesskey, secrect string, env ...string) (client *Client, err error) { | ||||||
|  | 	client = &Client{} | ||||||
|  | 	err = client.InitWithAliAppcode(accesskey, secrect, env...) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Client) GetUserInfo(req *GetPwdRequest) (response *GetPwdResponse, err error) { | ||||||
|  | 	response = CreateGetPwdResponse() | ||||||
|  | 	err = c.DoAction(req, response) | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								services/www/client_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								services/www/client_test.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | package www | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"log" | ||||||
|  | 	"testing" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func TestClient_GetUserInfo(t *testing.T) { | ||||||
|  | 
 | ||||||
|  | 	c, err := NewClientWithAliAppcode("203874304", "9e5489a82dd641729186cdad166d81a3") | ||||||
|  | 	if err != nil { | ||||||
|  | 		t.Error(err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	req := CreateGetPwdRequest() | ||||||
|  | 	req.UserName = "ttom666" | ||||||
|  | 
 | ||||||
|  | 	resp, err := c.GetUserInfo(req) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatalln(err) | ||||||
|  | 	} | ||||||
|  | 	fmt.Println(resp.GetHttpContentString()) | ||||||
|  | 	fmt.Println(resp.GetHttpHeaders()) | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								services/www/get_pwd.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								services/www/get_pwd.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,38 @@ | |||||||
|  | package www | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests" | ||||||
|  | 	"golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type GetPwdRequest struct { | ||||||
|  | 	*requests.RpcRequest | ||||||
|  | 	UserName string `position:"Query" field:"user_name" default:"-" ` | ||||||
|  | 	Uid      int64  `position:"Query" field:"uid" default:"0"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type GetPwdResponse struct { | ||||||
|  | 	*responses.BaseResponse | ||||||
|  | 	Ret  int    `json:"ret"` | ||||||
|  | 	Msg  string `json:"msg"` | ||||||
|  | 	Data struct { | ||||||
|  | 		UserName string `json:"user_name"` | ||||||
|  | 		UserPwd  string `json:"user_pwd"` | ||||||
|  | 	} `json:"data"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateGetPwdRequest() (req *GetPwdRequest) { | ||||||
|  | 	req = &GetPwdRequest{ | ||||||
|  | 		RpcRequest: &requests.RpcRequest{}, | ||||||
|  | 	} | ||||||
|  | 	req.InitWithApiInfo(HOST, VERSION, "/api/limit/getPwd.php") | ||||||
|  | 	req.Method = requests.GET | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func CreateGetPwdResponse() (response *GetPwdResponse) { | ||||||
|  | 	response = &GetPwdResponse{ | ||||||
|  | 		BaseResponse: &responses.BaseResponse{}, | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								services/www/get_token.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								services/www/get_token.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | package www | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user