alibabacloud-gateway-pds/golang/client/client.go (393 lines of code) (raw):
// This file is auto-generated, don't edit it. Thanks.
package client
import (
spi "github.com/alibabacloud-go/alibabacloud-gateway-spi/client"
array "github.com/alibabacloud-go/darabonba-array/client"
encodeutil "github.com/alibabacloud-go/darabonba-encode-util/client"
map_ "github.com/alibabacloud-go/darabonba-map/client"
signatureutil "github.com/alibabacloud-go/darabonba-signature-util/client"
string_ "github.com/alibabacloud-go/darabonba-string/client"
openapiutil "github.com/alibabacloud-go/openapi-util/service"
util "github.com/alibabacloud-go/tea-utils/v2/service"
"github.com/alibabacloud-go/tea/tea"
)
type Client struct {
spi.Client
}
func NewClient() (*Client, error) {
client := new(Client)
err := client.Init()
return client, err
}
func (client *Client) Init() (_err error) {
_err = client.Client.Init()
if _err != nil {
return _err
}
return nil
}
func (client *Client) ModifyConfiguration(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) {
config := context.Configuration
config.Endpoint, _err = client.GetEndpoint(config.Network, config.Endpoint)
if _err != nil {
return _err
}
return _err
}
func (client *Client) ModifyRequest(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) {
request := context.Request
config := context.Configuration
date := util.GetDateUTCString()
request.Headers = tea.Merge(map[string]*string{
"date": date,
"host": config.Endpoint,
"x-acs-version": request.Version,
"x-acs-action": request.Action,
"user-agent": request.UserAgent,
"x-acs-signature-nonce": util.GetNonce(),
"accept": tea.String("application/json"),
}, request.Headers)
signatureAlgorithm := util.DefaultString(request.SignatureAlgorithm, tea.String("ACS4-HMAC-SHA256"))
signatureVersion := util.DefaultString(request.SignatureVersion, tea.String("v1"))
hashedRequestPayload := encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(tea.String("")), signatureAlgorithm))
if !tea.BoolValue(util.IsUnset(request.Stream)) {
tmp, _err := util.ReadAsBytes(request.Stream)
if _err != nil {
return _err
}
hashedRequestPayload = encodeutil.HexEncode(encodeutil.Hash(tmp, signatureAlgorithm))
request.Stream = tea.ToReader(tmp)
request.Headers["content-type"] = tea.String("application/octet-stream")
} else {
if !tea.BoolValue(util.IsUnset(request.Body)) {
if tea.BoolValue(util.EqualString(request.ReqBodyType, tea.String("json"))) {
jsonObj := util.ToJSONString(request.Body)
hashedRequestPayload = encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(jsonObj), signatureAlgorithm))
request.Stream = tea.ToReader(jsonObj)
request.Headers["content-type"] = tea.String("application/json; charset=utf-8")
} else {
m, _err := util.AssertAsMap(request.Body)
if _err != nil {
return _err
}
formObj := openapiutil.ToForm(m)
hashedRequestPayload = encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(formObj), signatureAlgorithm))
request.Stream = tea.ToReader(formObj)
request.Headers["content-type"] = tea.String("application/x-www-form-urlencoded")
}
}
}
if tea.BoolValue(string_.Equals(signatureVersion, tea.String("v4"))) {
if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SM3"))) {
request.Headers["x-acs-content-sm3"] = hashedRequestPayload
} else {
request.Headers["x-acs-content-sha256"] = hashedRequestPayload
}
} else {
request.Headers["x-acs-signature-method"] = tea.String("HMAC-SHA1")
request.Headers["x-acs-signature-version"] = tea.String("1.0")
}
if !tea.BoolValue(util.EqualString(request.AuthType, tea.String("Anonymous"))) && !tea.BoolValue(util.IsUnset(request.Credential)) {
credential := request.Credential
credentialModel, _err := credential.GetCredential()
if _err != nil {
return _err
}
authType := credentialModel.Type
if tea.BoolValue(util.EqualString(authType, tea.String("bearer"))) {
bearerToken := credentialModel.BearerToken
request.Headers["x-acs-bearer-token"] = bearerToken
request.Headers["Authorization"] = tea.String("Bearer " + tea.StringValue(bearerToken))
} else {
accessKeyId := credentialModel.AccessKeyId
accessKeySecret := credentialModel.AccessKeySecret
securityToken := credentialModel.SecurityToken
if !tea.BoolValue(util.Empty(securityToken)) {
request.Headers["x-acs-security-token"] = securityToken
}
headers := make(map[string]*string)
if !tea.BoolValue(util.IsUnset(request.Headers["content-type"])) {
headers = request.Headers
} else if tea.BoolValue(string_.Equals(request.ReqBodyType, tea.String("formData"))) && tea.BoolValue(string_.Equals(request.Action, tea.String("DownloadFile"))) && tea.BoolValue(string_.Equals(request.Pathname, tea.String("/v2/file/download"))) {
headersArray := map_.KeySet(request.Headers)
for _, key := range headersArray {
headers[tea.StringValue(key)] = request.Headers[tea.StringValue(key)]
}
headers["content-type"] = tea.String("application/x-www-form-urlencoded; charset=UTF-8")
} else {
headers = request.Headers
}
if tea.BoolValue(string_.Equals(signatureVersion, tea.String("v4"))) {
dateNew := string_.SubString(date, tea.Int(0), tea.Int(10))
region := client.GetRegion(config.Endpoint)
signingkey, _err := client.GetSigningkey(signatureAlgorithm, accessKeySecret, region, dateNew)
if _err != nil {
return _err
}
request.Headers["Authorization"], _err = client.GetAuthorizationV4(request.Pathname, request.Method, request.Query, headers, signatureAlgorithm, hashedRequestPayload, accessKeyId, signingkey, request.ProductId, region, dateNew)
if _err != nil {
return _err
}
} else {
request.Headers["Authorization"], _err = client.GetAuthorization(request.Pathname, request.Method, request.Query, headers, accessKeyId, accessKeySecret)
if _err != nil {
return _err
}
}
}
}
return _err
}
func (client *Client) ModifyResponse(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) {
request := context.Request
response := context.Response
if tea.BoolValue(util.Is4xx(response.StatusCode)) || tea.BoolValue(util.Is5xx(response.StatusCode)) {
_res, _err := util.ReadAsJSON(response.Body)
if _err != nil {
return _err
}
err, _err := util.AssertAsMap(_res)
if _err != nil {
return _err
}
headers := response.Headers
requestId := headers["x-ca-request-id"]
err["statusCode"] = response.StatusCode
err["requestId"] = requestId
_err = tea.NewSDKError(map[string]interface{}{
"code": tea.ToString(client.DefaultAny(err["Code"], err["code"])),
"message": tea.ToString(client.DefaultAny(err["Message"], err["message"])),
"data": err,
})
return _err
}
if !tea.BoolValue(util.IsUnset(response.Body)) {
if tea.BoolValue(util.EqualNumber(response.StatusCode, tea.Int(204))) {
_, _err = util.ReadAsString(response.Body)
if _err != nil {
return _err
}
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("binary"))) {
response.DeserializedBody = response.Body
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("byte"))) {
byt, _err := util.ReadAsBytes(response.Body)
if _err != nil {
return _err
}
response.DeserializedBody = byt
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("string"))) {
str, _err := util.ReadAsString(response.Body)
if _err != nil {
return _err
}
response.DeserializedBody = str
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("json"))) {
response.DeserializedBody, _err = util.ReadAsJSON(response.Body)
if _err != nil {
return _err
}
} else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("array"))) {
response.DeserializedBody, _err = util.ReadAsJSON(response.Body)
if _err != nil {
return _err
}
} else {
response.DeserializedBody, _err = util.ReadAsString(response.Body)
if _err != nil {
return _err
}
}
}
return _err
}
func (client *Client) GetEndpoint(network *string, endpoint *string) (_result *string, _err error) {
realEndpoint := tea.String("api.aliyunpds.com")
if !tea.BoolValue(util.Empty(endpoint)) {
realEndpoint = endpoint
}
if !tea.BoolValue(util.Empty(network)) && tea.BoolValue(string_.Equals(network, tea.String("vpc"))) {
realEndpoint = string_.Replace(realEndpoint, tea.String("api.aliyunpds.com"), tea.String("api-vpc.aliyunpds.com"), nil)
realEndpoint = string_.Replace(realEndpoint, tea.String("admin.aliyunpds.com"), tea.String("admin-vpc.aliyunpds.com"), nil)
}
_result = realEndpoint
return _result, _err
}
func (client *Client) DefaultAny(inputValue interface{}, defaultValue interface{}) (_result interface{}) {
if tea.BoolValue(util.IsUnset(inputValue)) {
_result = defaultValue
return _result
}
_result = inputValue
return _result
}
func (client *Client) GetAuthorization(pathname *string, method *string, query map[string]*string, headers map[string]*string, ak *string, secret *string) (_result *string, _err error) {
signature, _err := client.GetSignature(pathname, method, query, headers, secret)
if _err != nil {
return _result, _err
}
_result = tea.String("acs " + tea.StringValue(ak) + ":" + tea.StringValue(signature))
return _result, _err
}
func (client *Client) GetSignature(pathname *string, method *string, query map[string]*string, headers map[string]*string, secret *string) (_result *string, _err error) {
stringToSign := tea.String("")
canonicalizedResource, _err := client.BuildCanonicalizedResource(pathname, query)
if _err != nil {
return _result, _err
}
canonicalizedHeaders, _err := client.BuildCanonicalizedHeaders(headers)
if _err != nil {
return _result, _err
}
stringToSign = tea.String(tea.StringValue(method) + "\n" + tea.StringValue(canonicalizedHeaders) + tea.StringValue(canonicalizedResource))
signature := signatureutil.HmacSHA1Sign(stringToSign, secret)
_body := encodeutil.Base64EncodeToString(signature)
_result = _body
return _result, _err
}
func (client *Client) BuildCanonicalizedResource(pathname *string, query map[string]*string) (_result *string, _err error) {
canonicalizedResource := pathname
if !tea.BoolValue(util.IsUnset(query)) {
queryArray := map_.KeySet(query)
sortedQueryArray := array.AscSort(queryArray)
separator := tea.String("?")
for _, key := range sortedQueryArray {
canonicalizedResource = tea.String(tea.StringValue(canonicalizedResource) + tea.StringValue(separator) + tea.StringValue(key))
if !tea.BoolValue(util.Empty(query[tea.StringValue(key)])) {
canonicalizedResource = tea.String(tea.StringValue(canonicalizedResource) + "=" + tea.StringValue(query[tea.StringValue(key)]))
}
separator = tea.String("&")
}
}
_result = canonicalizedResource
return _result, _err
}
func (client *Client) BuildCanonicalizedHeaders(headers map[string]*string) (_result *string, _err error) {
accept := headers["accept"]
if tea.BoolValue(util.IsUnset(accept)) {
accept = tea.String("")
}
contentMd5 := headers["content-md5"]
if tea.BoolValue(util.IsUnset(contentMd5)) {
contentMd5 = tea.String("")
}
contentType := headers["content-type"]
if tea.BoolValue(util.IsUnset(contentType)) {
contentType = tea.String("")
}
date := headers["date"]
if tea.BoolValue(util.IsUnset(date)) {
date = tea.String("")
}
canonicalizedHeaders := tea.String(tea.StringValue(accept) + "\n" + tea.StringValue(contentMd5) + "\n" + tea.StringValue(contentType) + "\n" + tea.StringValue(date) + "\n")
sortedHeaders, _err := client.GetSignedHeaders(headers)
if _err != nil {
return _result, _err
}
for _, header := range sortedHeaders {
value := headers[tea.StringValue(header)]
valueTrim := string_.Trim(value)
canonicalizedHeaders = tea.String(tea.StringValue(canonicalizedHeaders) + tea.StringValue(header) + ":" + tea.StringValue(valueTrim) + "\n")
}
_result = canonicalizedHeaders
return _result, _err
}
func (client *Client) GetSignedHeaders(headers map[string]*string) (_result []*string, _err error) {
headersArray := map_.KeySet(headers)
sortedHeadersArray := array.AscSort(headersArray)
tmp := tea.String("")
separator := tea.String("")
for _, key := range sortedHeadersArray {
lowerKey := string_.ToLower(key)
if tea.BoolValue(string_.HasPrefix(lowerKey, tea.String("x-acs-"))) {
if !tea.BoolValue(string_.Contains(tmp, lowerKey)) {
tmp = tea.String(tea.StringValue(tmp) + tea.StringValue(separator) + tea.StringValue(lowerKey))
separator = tea.String(";")
}
}
}
_result = make([]*string, 0)
_body := string_.Split(tmp, tea.String(";"), nil)
_result = _body
return _result, _err
}
func (client *Client) GetRegion(endpoint *string) (_result *string) {
region := tea.String("center")
if tea.BoolValue(util.Empty(endpoint)) {
_result = region
return _result
}
if tea.BoolValue(string_.Contains(endpoint, tea.String(".admin.aliyunpds.com"))) {
region = string_.Replace(endpoint, tea.String(".admin.aliyunpds.com"), tea.String(""), nil)
}
_result = region
return _result
}
func (client *Client) GetSigningkey(signatureAlgorithm *string, secret *string, region *string, date *string) (_result []byte, _err error) {
sc1 := tea.String("aliyun_v4" + tea.StringValue(secret))
sc2 := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SHA256"))) {
sc2 = signatureutil.HmacSHA256Sign(date, sc1)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SM3"))) {
sc2 = signatureutil.HmacSM3Sign(date, sc1)
}
sc3 := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SHA256"))) {
sc3 = signatureutil.HmacSHA256SignByBytes(region, sc2)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SM3"))) {
sc3 = signatureutil.HmacSM3SignByBytes(region, sc2)
}
sc4 := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SHA256"))) {
sc4 = signatureutil.HmacSHA256SignByBytes(tea.String("pds"), sc3)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SM3"))) {
sc4 = signatureutil.HmacSM3SignByBytes(tea.String("pds"), sc3)
}
hmac := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SHA256"))) {
hmac = signatureutil.HmacSHA256SignByBytes(tea.String("aliyun_v4_request"), sc4)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SM3"))) {
hmac = signatureutil.HmacSM3SignByBytes(tea.String("aliyun_v4_request"), sc4)
}
_result = hmac
return _result, _err
}
func (client *Client) GetAuthorizationV4(pathname *string, method *string, query map[string]*string, headers map[string]*string, signatureAlgorithm *string, payload *string, ak *string, signingkey []byte, product *string, region *string, date *string) (_result *string, _err error) {
signature, _err := client.GetSignatureV4(pathname, method, query, headers, signatureAlgorithm, payload, signingkey)
if _err != nil {
return _result, _err
}
signedHeaders, _err := client.GetSignedHeaders(headers)
if _err != nil {
return _result, _err
}
signedHeadersStr := array.Join(signedHeaders, tea.String(";"))
_result = tea.String(tea.StringValue(signatureAlgorithm) + " Credential=" + tea.StringValue(ak) + "/" + tea.StringValue(date) + "/" + tea.StringValue(region) + "/" + tea.StringValue(product) + "/aliyun_v4_request,SignedHeaders=" + tea.StringValue(signedHeadersStr) + ",Signature=" + tea.StringValue(signature))
return _result, _err
}
func (client *Client) GetSignatureV4(pathname *string, method *string, query map[string]*string, headers map[string]*string, signatureAlgorithm *string, payload *string, signingkey []byte) (_result *string, _err error) {
stringToSign := tea.String("")
canonicalizedResource, _err := client.BuildCanonicalizedResource(pathname, query)
if _err != nil {
return _result, _err
}
canonicalizedHeaders, _err := client.BuildCanonicalizedHeaders(headers)
if _err != nil {
return _result, _err
}
signedHeaders, _err := client.GetSignedHeaders(headers)
if _err != nil {
return _result, _err
}
signedHeadersStr := array.Join(signedHeaders, tea.String(";"))
stringToSign = tea.String(tea.StringValue(method) + "\n" + tea.StringValue(canonicalizedResource) + "\n" + tea.StringValue(canonicalizedHeaders) + "\n" + tea.StringValue(signedHeadersStr) + "\n" + tea.StringValue(payload))
hex := encodeutil.HexEncode(encodeutil.Hash(util.ToBytes(stringToSign), signatureAlgorithm))
stringToSign = tea.String(tea.StringValue(signatureAlgorithm) + "\n" + tea.StringValue(hex))
signature := util.ToBytes(tea.String(""))
if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SHA256"))) {
signature = signatureutil.HmacSHA256SignByBytes(stringToSign, signingkey)
} else if tea.BoolValue(util.EqualString(signatureAlgorithm, tea.String("ACS4-HMAC-SM3"))) {
signature = signatureutil.HmacSM3SignByBytes(stringToSign, signingkey)
}
_body := encodeutil.HexEncode(signature)
_result = _body
return _result, _err
}