alibabacloud-gateway-fc/golang/client/client.go (573 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" endpointutil "github.com/alibabacloud-go/endpoint-util/service" openapiutil "github.com/alibabacloud-go/openapi-util/service" util "github.com/alibabacloud-go/tea-utils/v2/service" "github.com/alibabacloud-go/tea/tea" credential "github.com/aliyun/credentials-go/credentials" ) type HttpRequest struct { Method *string `json:"method,omitempty" xml:"method,omitempty" require:"true"` Path *string `json:"path,omitempty" xml:"path,omitempty" require:"true"` Headers map[string]interface{} `json:"headers,omitempty" xml:"headers,omitempty"` Body []byte `json:"body,omitempty" xml:"body,omitempty"` ReqBodyType *string `json:"reqBodyType,omitempty" xml:"reqBodyType,omitempty"` } func (s HttpRequest) String() string { return tea.Prettify(s) } func (s HttpRequest) GoString() string { return s.String() } func (s *HttpRequest) SetMethod(v string) *HttpRequest { s.Method = &v return s } func (s *HttpRequest) SetPath(v string) *HttpRequest { s.Path = &v return s } func (s *HttpRequest) SetHeaders(v map[string]interface{}) *HttpRequest { s.Headers = v return s } func (s *HttpRequest) SetBody(v []byte) *HttpRequest { s.Body = v return s } func (s *HttpRequest) SetReqBodyType(v string) *HttpRequest { s.ReqBodyType = &v return s } 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) { request := context.Request config := context.Configuration config.Endpoint, _err = client.GetEndpoint(request.ProductId, config.RegionId, config.EndpointRule, config.Network, config.Suffix, config.EndpointMap, config.Endpoint) if _err != nil { return _err } return _err } func (client *Client) ModifyRequest(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) { config := context.Configuration if !tea.BoolValue(string_.HasSuffix(config.Endpoint, tea.String("aliyuncs.com"))) { _err = client.SignRequestForFc(context) if _err != nil { return _err } } else { _err = client.SignRequestForPop(context) if _err != nil { return _err } } return _err } func (client *Client) ModifyResponse(context *spi.InterceptorContext, attributeMap *spi.AttributeMap) (_err error) { request := context.Request config := context.Configuration response := context.Response if tea.BoolValue(util.Is4xx(response.StatusCode)) || tea.BoolValue(util.Is5xx(response.StatusCode)) { if tea.BoolValue(string_.HasPrefix(config.Endpoint, tea.String("fc."))) && tea.BoolValue(string_.HasSuffix(config.Endpoint, tea.String(".aliyuncs.com"))) { popRes, _err := util.ReadAsJSON(response.Body) if _err != nil { return _err } popErr, _err := util.AssertAsMap(popRes) if _err != nil { return _err } _err = tea.NewSDKError(map[string]interface{}{ "code": tea.ToString(client.DefaultAny(popErr["Code"], popErr["code"])), "message": "code: " + tea.ToString(tea.IntValue(response.StatusCode)) + ", " + tea.ToString(client.DefaultAny(popErr["Message"], popErr["message"])) + " request id: " + tea.ToString(client.DefaultAny(popErr["RequestID"], popErr["RequestId"])), "data": popErr, }) return _err } else { _headers, _err := util.AssertAsMap(response.Headers) if _err != nil { return _err } fcRes, _err := util.ReadAsJSON(response.Body) if _err != nil { return _err } fcErr, _err := util.AssertAsMap(fcRes) if _err != nil { return _err } _err = tea.NewSDKError(map[string]interface{}{ "code": fcErr["ErrorCode"], "message": "code: " + tea.ToString(tea.IntValue(response.StatusCode)) + ", " + tea.ToString(fcErr["ErrorMessage"]) + " request id: " + tea.ToString(_headers["x-fc-request-id"]), "data": fcErr, }) return _err } } 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"))) { obj, _err := util.ReadAsJSON(response.Body) if _err != nil { return _err } res, _err := util.AssertAsMap(obj) if _err != nil { return _err } response.DeserializedBody = res } else if tea.BoolValue(util.EqualString(request.BodyType, tea.String("array"))) { arr, _err := util.ReadAsJSON(response.Body) if _err != nil { return _err } response.DeserializedBody = arr } else { response.DeserializedBody, _err = util.ReadAsString(response.Body) if _err != nil { return _err } } return _err } func (client *Client) GetEndpoint(productId *string, regionId *string, endpointRule *string, network *string, suffix *string, endpointMap map[string]*string, endpoint *string) (_result *string, _err error) { if !tea.BoolValue(util.Empty(endpoint)) { _result = endpoint return _result, _err } if !tea.BoolValue(util.IsUnset(endpointMap)) && !tea.BoolValue(util.Empty(endpointMap[tea.StringValue(regionId)])) { _result = endpointMap[tea.StringValue(regionId)] return _result, _err } _body, _err := endpointutil.GetEndpointRules(productId, regionId, endpointRule, network, suffix) if _err != nil { return _result, _err } _result = _body 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) SignRequestForFc(context *spi.InterceptorContext) (_err error) { request := context.Request config := context.Configuration request.Headers = tea.Merge(map[string]*string{ "host": config.Endpoint, "date": util.GetDateUTCString(), "accept": tea.String("application/json"), "user-agent": request.UserAgent, }, request.Headers) request.Headers["content-type"] = tea.String("application/json") if !tea.BoolValue(util.IsUnset(request.Stream)) { tmp, _err := util.ReadAsBytes(request.Stream) if _err != nil { return _err } request.Stream = tea.ToReader(tmp) request.Headers["content-type"] = tea.String("application/octet-stream") request.Headers["content-md5"] = encodeutil.Base64EncodeToString(signatureutil.MD5SignForBytes(tmp)) } else { if !tea.BoolValue(util.IsUnset(request.Body)) { if tea.BoolValue(util.EqualString(request.ReqBodyType, tea.String("json"))) { jsonObj := util.ToJSONString(request.Body) request.Stream = tea.ToReader(jsonObj) request.Headers["content-type"] = tea.String("application/json") request.Headers["content-md5"] = encodeutil.Base64EncodeToString(signatureutil.MD5Sign(jsonObj)) } else { m, _err := util.AssertAsMap(request.Body) if _err != nil { return _err } formObj := openapiutil.ToForm(m) request.Stream = tea.ToReader(formObj) request.Headers["content-type"] = tea.String("application/x-www-form-urlencoded") request.Headers["content-md5"] = encodeutil.Base64EncodeToString(signatureutil.MD5Sign(formObj)) } } } credential := request.Credential accessKeyId, _err := credential.GetAccessKeyId() if _err != nil { return _err } accessKeySecret, _err := credential.GetAccessKeySecret() if _err != nil { return _err } securityToken, _err := credential.GetSecurityToken() if _err != nil { return _err } if !tea.BoolValue(util.Empty(securityToken)) { request.Headers["x-fc-security-token"] = securityToken } request.Headers["Authorization"], _err = client.GetAuthorizationForFc(request.Pathname, request.Method, request.Query, request.Headers, accessKeyId, accessKeySecret) if _err != nil { return _err } return _err } func (client *Client) SignRequestForPop(context *spi.InterceptorContext) (_err error) { request := context.Request config := context.Configuration request.Headers = tea.Merge(map[string]*string{ "host": config.Endpoint, "x-acs-version": request.Version, "x-acs-action": request.Action, "user-agent": request.UserAgent, "x-acs-date": openapiutil.GetTimestamp(), "x-acs-signature-nonce": util.GetNonce(), "accept": tea.String("application/json"), }, request.Headers) signatureAlgorithm := tea.String("ACS3-HMAC-SHA256") if !tea.BoolValue(util.IsUnset(request.SignatureAlgorithm)) { signatureAlgorithm = request.SignatureAlgorithm } 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") } } } request.Headers["x-acs-content-sha256"] = hashedRequestPayload if !tea.BoolValue(util.EqualString(request.AuthType, tea.String("Anonymous"))) { credential := request.Credential accessKeyId, _err := credential.GetAccessKeyId() if _err != nil { return _err } accessKeySecret, _err := credential.GetAccessKeySecret() if _err != nil { return _err } securityToken, _err := credential.GetSecurityToken() if _err != nil { return _err } if !tea.BoolValue(util.Empty(securityToken)) { request.Headers["x-acs-accesskey-id"] = accessKeyId request.Headers["x-acs-security-token"] = securityToken } request.Headers["Authorization"], _err = client.GetAuthorizationForPop(request.Pathname, request.Method, request.Query, request.Headers, signatureAlgorithm, hashedRequestPayload, accessKeyId, accessKeySecret) if _err != nil { return _err } } return _err } func (client *Client) GetAuthorizationForFc(pathname *string, method *string, query map[string]*string, headers map[string]*string, ak *string, secret *string) (_result *string, _err error) { sign, _err := client.GetSignatureForFc(pathname, method, query, headers, secret) if _err != nil { return _result, _err } _result = tea.String("FC " + tea.StringValue(ak) + ":" + tea.StringValue(sign)) return _result, _err } func (client *Client) GetSignatureForFc(pathname *string, method *string, query map[string]*string, headers map[string]*string, secret *string) (_result *string, _err error) { resource := pathname 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("") } stringToSign := tea.String("") canonicalizedResource, _err := client.BuildCanonicalizedResourceForFc(resource, query) if _err != nil { return _result, _err } canonicalizedHeaders, _err := client.BuildCanonicalizedHeadersForFc(headers) if _err != nil { return _result, _err } stringToSign = tea.String(tea.StringValue(method) + "\n" + tea.StringValue(contentMd5) + "\n" + tea.StringValue(contentType) + "\n" + tea.StringValue(headers["date"]) + "\n" + tea.StringValue(canonicalizedHeaders) + tea.StringValue(canonicalizedResource)) _body := encodeutil.Base64EncodeToString(signatureutil.HmacSHA256Sign(stringToSign, secret)) _result = _body return _result, _err } func (client *Client) BuildCanonicalizedResourceForFc(pathname *string, query map[string]*string) (_result *string, _err error) { paths := string_.Split(pathname, tea.String("?"), tea.Int(2)) canonicalizedResource := paths[0] resources := []*string{} if tea.BoolValue(util.EqualNumber(array.Size(paths), tea.Int(2))) { resources = string_.Split(paths[1], tea.String("&"), nil) } subResources := []*string{} tmp := tea.String("") separator := tea.String("") if !tea.BoolValue(util.IsUnset(query)) { queryList := map_.KeySet(query) for _, paramName := range queryList { tmp = tea.String(tea.StringValue(tmp) + tea.StringValue(separator) + tea.StringValue(paramName)) if !tea.BoolValue(util.IsUnset(query[tea.StringValue(paramName)])) { tmp = tea.String(tea.StringValue(tmp) + "=" + tea.StringValue(query[tea.StringValue(paramName)])) } separator = tea.String(";") } subResources = string_.Split(tmp, tea.String(";"), nil) } result := array.Concat(subResources, resources) sortedParams := array.AscSort(result) if tea.BoolValue(util.EqualNumber(array.Size(sortedParams), tea.Int(0))) { _result = tea.String(tea.StringValue(canonicalizedResource) + "\n") return _result, _err } subRes := array.Join(sortedParams, tea.String("\n")) _result = tea.String(tea.StringValue(canonicalizedResource) + "\n" + tea.StringValue(subRes)) return _result, _err } func (client *Client) BuildCanonicalizedHeadersForFc(headers map[string]*string) (_result *string, _err error) { canonicalizedHeaders := tea.String("") keys := map_.KeySet(headers) sortedHeaders := array.AscSort(keys) for _, header := range sortedHeaders { if tea.BoolValue(string_.Contains(string_.ToLower(header), tea.String("x-fc-"))) { canonicalizedHeaders = tea.String(tea.StringValue(canonicalizedHeaders) + tea.StringValue(string_.ToLower(header)) + ":" + tea.StringValue(headers[tea.StringValue(header)]) + "\n") } } _result = canonicalizedHeaders return _result, _err } func (client *Client) GetAuthorizationForPop(pathname *string, method *string, query map[string]*string, headers map[string]*string, signatureAlgorithm *string, payload *string, ak *string, secret *string) (_result *string, _err error) { signature, _err := client.GetSignatureForPop(pathname, method, query, headers, signatureAlgorithm, payload, secret) if _err != nil { return _result, _err } signedHeaders, _err := client.GetSignedHeaders(headers) if _err != nil { return _result, _err } _result = tea.String(tea.StringValue(signatureAlgorithm) + " Credential=" + tea.StringValue(ak) + ",SignedHeaders=" + tea.StringValue(array.Join(signedHeaders, tea.String(";"))) + ",Signature=" + tea.StringValue(signature)) return _result, _err } func (client *Client) GetSignatureForPop(pathname *string, method *string, query map[string]*string, headers map[string]*string, signatureAlgorithm *string, payload *string, secret *string) (_result *string, _err error) { canonicalURI := tea.String("/") if !tea.BoolValue(util.Empty(pathname)) { canonicalURI = pathname } stringToSign := tea.String("") canonicalizedResource, _err := client.BuildCanonicalizedResourceForPop(query) if _err != nil { return _result, _err } canonicalizedHeaders, _err := client.BuildCanonicalizedHeadersForPop(headers) if _err != nil { return _result, _err } signedHeaders, _err := client.GetSignedHeaders(headers) if _err != nil { return _result, _err } stringToSign = tea.String(tea.StringValue(method) + "\n" + tea.StringValue(canonicalURI) + "\n" + tea.StringValue(canonicalizedResource) + "\n" + tea.StringValue(canonicalizedHeaders) + "\n" + tea.StringValue(array.Join(signedHeaders, tea.String(";"))) + "\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(string_.Equals(signatureAlgorithm, tea.String("ACS3-HMAC-SHA256"))) { signature = signatureutil.HmacSHA256Sign(stringToSign, secret) } else if tea.BoolValue(string_.Equals(signatureAlgorithm, tea.String("ACS3-HMAC-SM3"))) { signature = signatureutil.HmacSM3Sign(stringToSign, secret) } else if tea.BoolValue(string_.Equals(signatureAlgorithm, tea.String("ACS3-RSA-SHA256"))) { signature = signatureutil.SHA256withRSASign(stringToSign, secret) } _body := encodeutil.HexEncode(signature) _result = _body return _result, _err } func (client *Client) BuildCanonicalizedResourceForPop(query map[string]*string) (_result *string, _err error) { canonicalizedResource := tea.String("") 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(encodeutil.PercentEncode(key))) if !tea.BoolValue(util.Empty(query[tea.StringValue(key)])) { canonicalizedResource = tea.String(tea.StringValue(canonicalizedResource) + "=" + tea.StringValue(encodeutil.PercentEncode(query[tea.StringValue(key)]))) } separator = tea.String("&") } } _result = canonicalizedResource return _result, _err } func (client *Client) BuildCanonicalizedHeadersForPop(headers map[string]*string) (_result *string, _err error) { canonicalizedHeaders := tea.String("") sortedHeaders, _err := client.GetSignedHeaders(headers) if _err != nil { return _result, _err } for _, header := range sortedHeaders { canonicalizedHeaders = tea.String(tea.StringValue(canonicalizedHeaders) + tea.StringValue(header) + ":" + tea.StringValue(string_.Trim(headers[tea.StringValue(header)])) + "\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-"))) || tea.BoolValue(string_.Equals(lowerKey, tea.String("host"))) || tea.BoolValue(string_.Equals(lowerKey, tea.String("content-type"))) { 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) SignRequest(request *HttpRequest, credential credential.Credential) (_result map[string]interface{}, _err error) { httpRequest := &HttpRequest{ Method: request.Method, Path: request.Path, Headers: request.Headers, Body: request.Body, ReqBodyType: request.ReqBodyType, } httpRequest.Headers["date"] = util.GetDateUTCString() httpRequest.Headers["accept"] = tea.String("application/json") httpRequest.Headers["content-type"] = tea.String("application/json") if !tea.BoolValue(util.IsUnset(request.Body)) { if tea.BoolValue(util.EqualString(request.ReqBodyType, tea.String("json"))) { httpRequest.Headers["content-type"] = tea.String("application/json") } else if tea.BoolValue(util.EqualString(request.ReqBodyType, tea.String("form"))) { httpRequest.Headers["content-type"] = tea.String("application/x-www-form-urlencoded") } else if tea.BoolValue(util.EqualString(request.ReqBodyType, tea.String("binary"))) { httpRequest.Headers["content-type"] = tea.String("application/octet-stream") } } accessKeyId, _err := credential.GetAccessKeyId() if _err != nil { return _result, _err } accessKeySecret, _err := credential.GetAccessKeySecret() if _err != nil { return _result, _err } securityToken, _err := credential.GetSecurityToken() if _err != nil { return _result, _err } if !tea.BoolValue(util.Empty(securityToken)) { httpRequest.Headers["x-fc-security-token"] = securityToken } resource := request.Path contentMd5 := httpRequest.Headers["content-md5"] if tea.BoolValue(util.IsUnset(contentMd5)) { contentMd5 = tea.String("") } contentType := httpRequest.Headers["content-type"] if tea.BoolValue(util.IsUnset(contentType)) { contentType = tea.String("") } stringToSign := tea.String("") canonicalizedResource, _err := client.BuildCanonicalizedResource(resource) if _err != nil { return _result, _err } canonicalizedHeaders, _err := client.BuildCanonicalizedHeaders(httpRequest.Headers) if _err != nil { return _result, _err } stringToSign = tea.String(tea.StringValue(request.Method) + "\n" + tea.StringValue(util.ToJSONString(contentMd5)) + "\n" + tea.StringValue(util.ToJSONString(contentType)) + "\n" + tea.StringValue(util.ToJSONString(httpRequest.Headers["date"])) + "\n" + tea.StringValue(canonicalizedHeaders) + tea.StringValue(canonicalizedResource)) signature := encodeutil.Base64EncodeToString(signatureutil.HmacSHA256Sign(stringToSign, accessKeySecret)) httpRequest.Headers["Authorization"] = tea.String("FC " + tea.StringValue(accessKeyId) + ":" + tea.StringValue(signature)) _result = httpRequest.Headers return _result, _err } func (client *Client) BuildCanonicalizedResource(pathname *string) (_result *string, _err error) { paths := string_.Split(pathname, tea.String("?"), tea.Int(2)) canonicalizedResource := paths[0] resources := []*string{} if tea.BoolValue(util.EqualNumber(array.Size(paths), tea.Int(2))) { resources = string_.Split(paths[1], tea.String("&"), nil) } sortedParams := array.AscSort(resources) if tea.BoolValue(util.EqualNumber(array.Size(sortedParams), tea.Int(0))) { _result = tea.String(tea.StringValue(canonicalizedResource) + "\n") return _result, _err } subResources := array.Join(sortedParams, tea.String("\n")) _result = tea.String(tea.StringValue(canonicalizedResource) + "\n" + tea.StringValue(subResources)) return _result, _err } func (client *Client) BuildCanonicalizedHeaders(headers map[string]interface{}) (_result *string, _err error) { canonicalizedHeaders := tea.String("") keys := map_.KeySet(headers) sortedHeaders := array.AscSort(keys) for _, header := range sortedHeaders { if tea.BoolValue(string_.Contains(string_.ToLower(header), tea.String("x-fc-"))) { canonicalizedHeaders = tea.String(tea.StringValue(canonicalizedHeaders) + tea.StringValue(string_.ToLower(header)) + ":" + tea.StringValue(util.ToJSONString(headers[tea.StringValue(header)])) + "\n") } } _result = canonicalizedHeaders return _result, _err }