alibabacloud-gateway-fc/csharp/core/Client.cs (923 lines of code) (raw):

// This file is auto-generated, don't edit it. Thanks. using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Tea; using Tea.Utils; using AlibabaCloud.GatewayFc.Models; namespace AlibabaCloud.GatewayFc { public class Client : AlibabaCloud.GatewaySpi.Client { public Client(): base() { } public void ModifyConfiguration(AlibabaCloud.GatewaySpi.Models.InterceptorContext context, AlibabaCloud.GatewaySpi.Models.AttributeMap attributeMap) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; config.Endpoint = GetEndpoint(request.ProductId, config.RegionId, config.EndpointRule, config.Network, config.Suffix, config.EndpointMap, config.Endpoint); } public async Task ModifyConfigurationAsync(AlibabaCloud.GatewaySpi.Models.InterceptorContext context, AlibabaCloud.GatewaySpi.Models.AttributeMap attributeMap) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; config.Endpoint = GetEndpoint(request.ProductId, config.RegionId, config.EndpointRule, config.Network, config.Suffix, config.EndpointMap, config.Endpoint); } public void ModifyRequest(AlibabaCloud.GatewaySpi.Models.InterceptorContext context, AlibabaCloud.GatewaySpi.Models.AttributeMap attributeMap) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; if (!AlibabaCloud.DarabonbaString.StringUtil.HasSuffix(config.Endpoint, "aliyuncs.com")) { SignRequestForFc(context); } else { SignRequestForPop(context); } } public async Task ModifyRequestAsync(AlibabaCloud.GatewaySpi.Models.InterceptorContext context, AlibabaCloud.GatewaySpi.Models.AttributeMap attributeMap) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; if (!AlibabaCloud.DarabonbaString.StringUtil.HasSuffix(config.Endpoint, "aliyuncs.com")) { await SignRequestForFcAsync(context); } else { await SignRequestForPopAsync(context); } } public void ModifyResponse(AlibabaCloud.GatewaySpi.Models.InterceptorContext context, AlibabaCloud.GatewaySpi.Models.AttributeMap attributeMap) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextResponse response = context.Response; if (AlibabaCloud.TeaUtil.Common.Is4xx(response.StatusCode) || AlibabaCloud.TeaUtil.Common.Is5xx(response.StatusCode)) { if (AlibabaCloud.DarabonbaString.StringUtil.HasPrefix(config.Endpoint, "fc.") && AlibabaCloud.DarabonbaString.StringUtil.HasSuffix(config.Endpoint, ".aliyuncs.com")) { object popRes = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); Dictionary<string, object> popErr = AlibabaCloud.TeaUtil.Common.AssertAsMap(popRes); throw new TeaException(new Dictionary<string, object> { {"code", "" + DefaultAny(popErr.Get("Code"), popErr.Get("code"))}, {"message", "code: " + response.StatusCode + ", " + DefaultAny(popErr.Get("Message"), popErr.Get("message")) + " request id: " + DefaultAny(popErr.Get("RequestID"), popErr.Get("RequestId"))}, {"data", popErr}, }); } else { Dictionary<string, object> _headers = AlibabaCloud.TeaUtil.Common.AssertAsMap(response.Headers); object fcRes = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); Dictionary<string, object> fcErr = AlibabaCloud.TeaUtil.Common.AssertAsMap(fcRes); throw new TeaException(new Dictionary<string, object> { {"code", fcErr.Get("ErrorCode")}, {"message", "code: " + response.StatusCode + ", " + fcErr.Get("ErrorMessage") + " request id: " + _headers.Get("x-fc-request-id")}, {"data", fcErr}, }); } } if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "binary")) { response.DeserializedBody = response.Body; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "byte")) { byte[] byt = AlibabaCloud.TeaUtil.Common.ReadAsBytes(response.Body); response.DeserializedBody = byt; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "string")) { string str = AlibabaCloud.TeaUtil.Common.ReadAsString(response.Body); response.DeserializedBody = str; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "json")) { object obj = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); Dictionary<string, object> res = AlibabaCloud.TeaUtil.Common.AssertAsMap(obj); response.DeserializedBody = res; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "array")) { object arr = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); response.DeserializedBody = arr; } else { response.DeserializedBody = AlibabaCloud.TeaUtil.Common.ReadAsString(response.Body); } } public async Task ModifyResponseAsync(AlibabaCloud.GatewaySpi.Models.InterceptorContext context, AlibabaCloud.GatewaySpi.Models.AttributeMap attributeMap) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextResponse response = context.Response; if (AlibabaCloud.TeaUtil.Common.Is4xx(response.StatusCode) || AlibabaCloud.TeaUtil.Common.Is5xx(response.StatusCode)) { if (AlibabaCloud.DarabonbaString.StringUtil.HasPrefix(config.Endpoint, "fc.") && AlibabaCloud.DarabonbaString.StringUtil.HasSuffix(config.Endpoint, ".aliyuncs.com")) { object popRes = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); Dictionary<string, object> popErr = AlibabaCloud.TeaUtil.Common.AssertAsMap(popRes); throw new TeaException(new Dictionary<string, object> { {"code", "" + DefaultAny(popErr.Get("Code"), popErr.Get("code"))}, {"message", "code: " + response.StatusCode + ", " + DefaultAny(popErr.Get("Message"), popErr.Get("message")) + " request id: " + DefaultAny(popErr.Get("RequestID"), popErr.Get("RequestId"))}, {"data", popErr}, }); } else { Dictionary<string, object> _headers = AlibabaCloud.TeaUtil.Common.AssertAsMap(response.Headers); object fcRes = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); Dictionary<string, object> fcErr = AlibabaCloud.TeaUtil.Common.AssertAsMap(fcRes); throw new TeaException(new Dictionary<string, object> { {"code", fcErr.Get("ErrorCode")}, {"message", "code: " + response.StatusCode + ", " + fcErr.Get("ErrorMessage") + " request id: " + _headers.Get("x-fc-request-id")}, {"data", fcErr}, }); } } if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "binary")) { response.DeserializedBody = response.Body; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "byte")) { byte[] byt = AlibabaCloud.TeaUtil.Common.ReadAsBytes(response.Body); response.DeserializedBody = byt; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "string")) { string str = AlibabaCloud.TeaUtil.Common.ReadAsString(response.Body); response.DeserializedBody = str; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "json")) { object obj = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); Dictionary<string, object> res = AlibabaCloud.TeaUtil.Common.AssertAsMap(obj); response.DeserializedBody = res; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.BodyType, "array")) { object arr = AlibabaCloud.TeaUtil.Common.ReadAsJSON(response.Body); response.DeserializedBody = arr; } else { response.DeserializedBody = AlibabaCloud.TeaUtil.Common.ReadAsString(response.Body); } } public string GetEndpoint(string productId, string regionId, string endpointRule, string network, string suffix, Dictionary<string, string> endpointMap, string endpoint) { if (!AlibabaCloud.TeaUtil.Common.Empty(endpoint)) { return endpoint; } if (!AlibabaCloud.TeaUtil.Common.IsUnset(endpointMap) && !AlibabaCloud.TeaUtil.Common.Empty(endpointMap.Get(regionId))) { return endpointMap.Get(regionId); } return AlibabaCloud.EndpointUtil.Common.GetEndpointRules(productId, regionId, endpointRule, network, suffix); } public object DefaultAny(object inputValue, object defaultValue) { if (AlibabaCloud.TeaUtil.Common.IsUnset(inputValue)) { return defaultValue; } return inputValue; } public void SignRequestForFc(AlibabaCloud.GatewaySpi.Models.InterceptorContext context) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; request.Headers = TeaConverter.merge<string> ( new Dictionary<string, string>() { {"host", config.Endpoint}, {"date", AlibabaCloud.TeaUtil.Common.GetDateUTCString()}, {"accept", "application/json"}, {"user-agent", request.UserAgent}, }, request.Headers ); request.Headers["content-type"] = "application/json"; if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Stream)) { byte[] tmp = AlibabaCloud.TeaUtil.Common.ReadAsBytes(request.Stream); request.Stream = TeaCore.BytesReadable(tmp); request.Headers["content-type"] = "application/octet-stream"; request.Headers["content-md5"] = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.MD5SignForBytes(tmp)); } else { if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body)) { if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "json")) { string jsonObj = AlibabaCloud.TeaUtil.Common.ToJSONString(request.Body); request.Stream = TeaCore.BytesReadable(jsonObj); request.Headers["content-type"] = "application/json"; request.Headers["content-md5"] = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.MD5Sign(jsonObj)); } else { Dictionary<string, object> m = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body); string formObj = AlibabaCloud.OpenApiUtil.Client.ToForm(m); request.Stream = TeaCore.BytesReadable(formObj); request.Headers["content-type"] = "application/x-www-form-urlencoded"; request.Headers["content-md5"] = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.MD5Sign(formObj)); } } } Aliyun.Credentials.Client credential = request.Credential; string accessKeyId = credential.GetAccessKeyId(); string accessKeySecret = credential.GetAccessKeySecret(); string securityToken = credential.GetSecurityToken(); if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken)) { request.Headers["x-fc-security-token"] = securityToken; } request.Headers["Authorization"] = GetAuthorizationForFc(request.Pathname, request.Method, request.Query, request.Headers, accessKeyId, accessKeySecret); } public async Task SignRequestForFcAsync(AlibabaCloud.GatewaySpi.Models.InterceptorContext context) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; request.Headers = TeaConverter.merge<string> ( new Dictionary<string, string>() { {"host", config.Endpoint}, {"date", AlibabaCloud.TeaUtil.Common.GetDateUTCString()}, {"accept", "application/json"}, {"user-agent", request.UserAgent}, }, request.Headers ); request.Headers["content-type"] = "application/json"; if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Stream)) { byte[] tmp = AlibabaCloud.TeaUtil.Common.ReadAsBytes(request.Stream); request.Stream = TeaCore.BytesReadable(tmp); request.Headers["content-type"] = "application/octet-stream"; request.Headers["content-md5"] = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.MD5SignForBytes(tmp)); } else { if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body)) { if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "json")) { string jsonObj = AlibabaCloud.TeaUtil.Common.ToJSONString(request.Body); request.Stream = TeaCore.BytesReadable(jsonObj); request.Headers["content-type"] = "application/json"; request.Headers["content-md5"] = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.MD5Sign(jsonObj)); } else { Dictionary<string, object> m = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body); string formObj = AlibabaCloud.OpenApiUtil.Client.ToForm(m); request.Stream = TeaCore.BytesReadable(formObj); request.Headers["content-type"] = "application/x-www-form-urlencoded"; request.Headers["content-md5"] = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.MD5Sign(formObj)); } } } Aliyun.Credentials.Client credential = request.Credential; string accessKeyId = await credential.GetAccessKeyIdAsync(); string accessKeySecret = await credential.GetAccessKeySecretAsync(); string securityToken = await credential.GetSecurityTokenAsync(); if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken)) { request.Headers["x-fc-security-token"] = securityToken; } request.Headers["Authorization"] = await GetAuthorizationForFcAsync(request.Pathname, request.Method, request.Query, request.Headers, accessKeyId, accessKeySecret); } public void SignRequestForPop(AlibabaCloud.GatewaySpi.Models.InterceptorContext context) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; request.Headers = TeaConverter.merge<string> ( new Dictionary<string, string>() { {"host", config.Endpoint}, {"x-acs-version", request.Version}, {"x-acs-action", request.Action}, {"user-agent", request.UserAgent}, {"x-acs-date", AlibabaCloud.OpenApiUtil.Client.GetTimestamp()}, {"x-acs-signature-nonce", AlibabaCloud.TeaUtil.Common.GetNonce()}, {"accept", "application/json"}, }, request.Headers ); string signatureAlgorithm = "ACS3-HMAC-SHA256"; if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.SignatureAlgorithm)) { signatureAlgorithm = request.SignatureAlgorithm; } string hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(""), signatureAlgorithm)); if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Stream)) { byte[] tmp = AlibabaCloud.TeaUtil.Common.ReadAsBytes(request.Stream); hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(tmp, signatureAlgorithm)); request.Stream = TeaCore.BytesReadable(tmp); request.Headers["content-type"] = "application/octet-stream"; } else { if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body)) { if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "json")) { string jsonObj = AlibabaCloud.TeaUtil.Common.ToJSONString(request.Body); hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(jsonObj), signatureAlgorithm)); request.Stream = TeaCore.BytesReadable(jsonObj); request.Headers["content-type"] = "application/json; charset=utf-8"; } else { Dictionary<string, object> m = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body); string formObj = AlibabaCloud.OpenApiUtil.Client.ToForm(m); hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(formObj), signatureAlgorithm)); request.Stream = TeaCore.BytesReadable(formObj); request.Headers["content-type"] = "application/x-www-form-urlencoded"; } } } request.Headers["x-acs-content-sha256"] = hashedRequestPayload; if (!AlibabaCloud.TeaUtil.Common.EqualString(request.AuthType, "Anonymous")) { Aliyun.Credentials.Client credential = request.Credential; string accessKeyId = credential.GetAccessKeyId(); string accessKeySecret = credential.GetAccessKeySecret(); string securityToken = credential.GetSecurityToken(); if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken)) { request.Headers["x-acs-accesskey-id"] = accessKeyId; request.Headers["x-acs-security-token"] = securityToken; } request.Headers["Authorization"] = GetAuthorizationForPop(request.Pathname, request.Method, request.Query, request.Headers, signatureAlgorithm, hashedRequestPayload, accessKeyId, accessKeySecret); } } public async Task SignRequestForPopAsync(AlibabaCloud.GatewaySpi.Models.InterceptorContext context) { AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextRequest request = context.Request; AlibabaCloud.GatewaySpi.Models.InterceptorContext.InterceptorContextConfiguration config = context.Configuration; request.Headers = TeaConverter.merge<string> ( new Dictionary<string, string>() { {"host", config.Endpoint}, {"x-acs-version", request.Version}, {"x-acs-action", request.Action}, {"user-agent", request.UserAgent}, {"x-acs-date", AlibabaCloud.OpenApiUtil.Client.GetTimestamp()}, {"x-acs-signature-nonce", AlibabaCloud.TeaUtil.Common.GetNonce()}, {"accept", "application/json"}, }, request.Headers ); string signatureAlgorithm = "ACS3-HMAC-SHA256"; if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.SignatureAlgorithm)) { signatureAlgorithm = request.SignatureAlgorithm; } string hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(""), signatureAlgorithm)); if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Stream)) { byte[] tmp = AlibabaCloud.TeaUtil.Common.ReadAsBytes(request.Stream); hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(tmp, signatureAlgorithm)); request.Stream = TeaCore.BytesReadable(tmp); request.Headers["content-type"] = "application/octet-stream"; } else { if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body)) { if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "json")) { string jsonObj = AlibabaCloud.TeaUtil.Common.ToJSONString(request.Body); hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(jsonObj), signatureAlgorithm)); request.Stream = TeaCore.BytesReadable(jsonObj); request.Headers["content-type"] = "application/json; charset=utf-8"; } else { Dictionary<string, object> m = AlibabaCloud.TeaUtil.Common.AssertAsMap(request.Body); string formObj = AlibabaCloud.OpenApiUtil.Client.ToForm(m); hashedRequestPayload = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(formObj), signatureAlgorithm)); request.Stream = TeaCore.BytesReadable(formObj); request.Headers["content-type"] = "application/x-www-form-urlencoded"; } } } request.Headers["x-acs-content-sha256"] = hashedRequestPayload; if (!AlibabaCloud.TeaUtil.Common.EqualString(request.AuthType, "Anonymous")) { Aliyun.Credentials.Client credential = request.Credential; string accessKeyId = await credential.GetAccessKeyIdAsync(); string accessKeySecret = await credential.GetAccessKeySecretAsync(); string securityToken = await credential.GetSecurityTokenAsync(); if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken)) { request.Headers["x-acs-accesskey-id"] = accessKeyId; request.Headers["x-acs-security-token"] = securityToken; } request.Headers["Authorization"] = await GetAuthorizationForPopAsync(request.Pathname, request.Method, request.Query, request.Headers, signatureAlgorithm, hashedRequestPayload, accessKeyId, accessKeySecret); } } public string GetAuthorizationForFc(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string ak, string secret) { string sign = GetSignatureForFc(pathname, method, query, headers, secret); return "FC " + ak + ":" + sign; } public async Task<string> GetAuthorizationForFcAsync(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string ak, string secret) { string sign = await GetSignatureForFcAsync(pathname, method, query, headers, secret); return "FC " + ak + ":" + sign; } public string GetSignatureForFc(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string secret) { string resource = pathname; string contentMd5 = headers.Get("content-md5"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentMd5)) { contentMd5 = ""; } string contentType = headers.Get("content-type"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentType)) { contentType = ""; } string stringToSign = ""; string canonicalizedResource = BuildCanonicalizedResourceForFc(resource, query); string canonicalizedHeaders = BuildCanonicalizedHeadersForFc(headers); stringToSign = "" + method + "\n" + contentMd5 + "\n" + contentType + "\n" + headers.Get("date") + "\n" + canonicalizedHeaders + canonicalizedResource; return AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSHA256Sign(stringToSign, secret)); } public async Task<string> GetSignatureForFcAsync(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string secret) { string resource = pathname; string contentMd5 = headers.Get("content-md5"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentMd5)) { contentMd5 = ""; } string contentType = headers.Get("content-type"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentType)) { contentType = ""; } string stringToSign = ""; string canonicalizedResource = await BuildCanonicalizedResourceForFcAsync(resource, query); string canonicalizedHeaders = await BuildCanonicalizedHeadersForFcAsync(headers); stringToSign = "" + method + "\n" + contentMd5 + "\n" + contentType + "\n" + headers.Get("date") + "\n" + canonicalizedHeaders + canonicalizedResource; return AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSHA256Sign(stringToSign, secret)); } public string BuildCanonicalizedResourceForFc(string pathname, Dictionary<string, string> query) { List<string> paths = AlibabaCloud.DarabonbaString.StringUtil.Split(pathname, "?", 2); string canonicalizedResource = paths[0]; List<string> resources = new List<string> { }; if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(paths), 2)) { resources = AlibabaCloud.DarabonbaString.StringUtil.Split(paths[1], "&", null); } List<string> subResources = new List<string> { }; string tmp = ""; string separator = ""; if (!AlibabaCloud.TeaUtil.Common.IsUnset(query)) { List<string> queryList = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(query); foreach (var paramName in queryList) { tmp = "" + tmp + separator + paramName; if (!AlibabaCloud.TeaUtil.Common.IsUnset(query.Get(paramName))) { tmp = "" + tmp + "=" + query.Get(paramName); } separator = ";"; } subResources = AlibabaCloud.DarabonbaString.StringUtil.Split(tmp, ";", null); } List<string> result = AlibabaCloud.DarabonbaArray.ArrayUtil.Concat(subResources, resources); List<string> sortedParams = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(result); if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(sortedParams), 0)) { return "" + canonicalizedResource + "\n"; } string subRes = AlibabaCloud.DarabonbaArray.ArrayUtil.Join(sortedParams, "\n"); return "" + canonicalizedResource + "\n" + subRes; } public async Task<string> BuildCanonicalizedResourceForFcAsync(string pathname, Dictionary<string, string> query) { List<string> paths = AlibabaCloud.DarabonbaString.StringUtil.Split(pathname, "?", 2); string canonicalizedResource = paths[0]; List<string> resources = new List<string> { }; if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(paths), 2)) { resources = AlibabaCloud.DarabonbaString.StringUtil.Split(paths[1], "&", null); } List<string> subResources = new List<string> { }; string tmp = ""; string separator = ""; if (!AlibabaCloud.TeaUtil.Common.IsUnset(query)) { List<string> queryList = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(query); foreach (var paramName in queryList) { tmp = "" + tmp + separator + paramName; if (!AlibabaCloud.TeaUtil.Common.IsUnset(query.Get(paramName))) { tmp = "" + tmp + "=" + query.Get(paramName); } separator = ";"; } subResources = AlibabaCloud.DarabonbaString.StringUtil.Split(tmp, ";", null); } List<string> result = AlibabaCloud.DarabonbaArray.ArrayUtil.Concat(subResources, resources); List<string> sortedParams = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(result); if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(sortedParams), 0)) { return "" + canonicalizedResource + "\n"; } string subRes = AlibabaCloud.DarabonbaArray.ArrayUtil.Join(sortedParams, "\n"); return "" + canonicalizedResource + "\n" + subRes; } public string BuildCanonicalizedHeadersForFc(Dictionary<string, string> headers) { string canonicalizedHeaders = ""; List<string> keys = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(headers); List<string> sortedHeaders = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(keys); foreach (var header in sortedHeaders) { if (AlibabaCloud.DarabonbaString.StringUtil.Contains(AlibabaCloud.DarabonbaString.StringUtil.ToLower(header), "x-fc-")) { canonicalizedHeaders = "" + canonicalizedHeaders + AlibabaCloud.DarabonbaString.StringUtil.ToLower(header) + ":" + headers.Get(header) + "\n"; } } return canonicalizedHeaders; } public async Task<string> BuildCanonicalizedHeadersForFcAsync(Dictionary<string, string> headers) { string canonicalizedHeaders = ""; List<string> keys = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(headers); List<string> sortedHeaders = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(keys); foreach (var header in sortedHeaders) { if (AlibabaCloud.DarabonbaString.StringUtil.Contains(AlibabaCloud.DarabonbaString.StringUtil.ToLower(header), "x-fc-")) { canonicalizedHeaders = "" + canonicalizedHeaders + AlibabaCloud.DarabonbaString.StringUtil.ToLower(header) + ":" + headers.Get(header) + "\n"; } } return canonicalizedHeaders; } public string GetAuthorizationForPop(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string signatureAlgorithm, string payload, string ak, string secret) { string signature = GetSignatureForPop(pathname, method, query, headers, signatureAlgorithm, payload, secret); List<string> signedHeaders = GetSignedHeaders(headers); return "" + signatureAlgorithm + " Credential=" + ak + ",SignedHeaders=" + AlibabaCloud.DarabonbaArray.ArrayUtil.Join(signedHeaders, ";") + ",Signature=" + signature; } public async Task<string> GetAuthorizationForPopAsync(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string signatureAlgorithm, string payload, string ak, string secret) { string signature = await GetSignatureForPopAsync(pathname, method, query, headers, signatureAlgorithm, payload, secret); List<string> signedHeaders = await GetSignedHeadersAsync(headers); return "" + signatureAlgorithm + " Credential=" + ak + ",SignedHeaders=" + AlibabaCloud.DarabonbaArray.ArrayUtil.Join(signedHeaders, ";") + ",Signature=" + signature; } public string GetSignatureForPop(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string signatureAlgorithm, string payload, string secret) { string canonicalURI = "/"; if (!AlibabaCloud.TeaUtil.Common.Empty(pathname)) { canonicalURI = pathname; } string stringToSign = ""; string canonicalizedResource = BuildCanonicalizedResourceForPop(query); string canonicalizedHeaders = BuildCanonicalizedHeadersForPop(headers); List<string> signedHeaders = GetSignedHeaders(headers); stringToSign = "" + method + "\n" + canonicalURI + "\n" + canonicalizedResource + "\n" + canonicalizedHeaders + "\n" + AlibabaCloud.DarabonbaArray.ArrayUtil.Join(signedHeaders, ";") + "\n" + payload; string hex = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(stringToSign), signatureAlgorithm)); stringToSign = "" + signatureAlgorithm + "\n" + hex; byte[] signature = AlibabaCloud.TeaUtil.Common.ToBytes(""); if (AlibabaCloud.DarabonbaString.StringUtil.Equals(signatureAlgorithm, "ACS3-HMAC-SHA256")) { signature = AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSHA256Sign(stringToSign, secret); } else if (AlibabaCloud.DarabonbaString.StringUtil.Equals(signatureAlgorithm, "ACS3-HMAC-SM3")) { signature = AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSM3Sign(stringToSign, secret); } else if (AlibabaCloud.DarabonbaString.StringUtil.Equals(signatureAlgorithm, "ACS3-RSA-SHA256")) { signature = AlibabaCloud.DarabonbaSignatureUtil.Signer.SHA256withRSASign(stringToSign, secret); } return AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(signature); } public async Task<string> GetSignatureForPopAsync(string pathname, string method, Dictionary<string, string> query, Dictionary<string, string> headers, string signatureAlgorithm, string payload, string secret) { string canonicalURI = "/"; if (!AlibabaCloud.TeaUtil.Common.Empty(pathname)) { canonicalURI = pathname; } string stringToSign = ""; string canonicalizedResource = await BuildCanonicalizedResourceForPopAsync(query); string canonicalizedHeaders = await BuildCanonicalizedHeadersForPopAsync(headers); List<string> signedHeaders = await GetSignedHeadersAsync(headers); stringToSign = "" + method + "\n" + canonicalURI + "\n" + canonicalizedResource + "\n" + canonicalizedHeaders + "\n" + AlibabaCloud.DarabonbaArray.ArrayUtil.Join(signedHeaders, ";") + "\n" + payload; string hex = AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(AlibabaCloud.DarabonbaEncodeUtil.Encoder.Hash(AlibabaCloud.TeaUtil.Common.ToBytes(stringToSign), signatureAlgorithm)); stringToSign = "" + signatureAlgorithm + "\n" + hex; byte[] signature = AlibabaCloud.TeaUtil.Common.ToBytes(""); if (AlibabaCloud.DarabonbaString.StringUtil.Equals(signatureAlgorithm, "ACS3-HMAC-SHA256")) { signature = AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSHA256Sign(stringToSign, secret); } else if (AlibabaCloud.DarabonbaString.StringUtil.Equals(signatureAlgorithm, "ACS3-HMAC-SM3")) { signature = AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSM3Sign(stringToSign, secret); } else if (AlibabaCloud.DarabonbaString.StringUtil.Equals(signatureAlgorithm, "ACS3-RSA-SHA256")) { signature = AlibabaCloud.DarabonbaSignatureUtil.Signer.SHA256withRSASign(stringToSign, secret); } return AlibabaCloud.DarabonbaEncodeUtil.Encoder.HexEncode(signature); } public string BuildCanonicalizedResourceForPop(Dictionary<string, string> query) { string canonicalizedResource = ""; if (!AlibabaCloud.TeaUtil.Common.IsUnset(query)) { List<string> queryArray = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(query); List<string> sortedQueryArray = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(queryArray); string separator = ""; foreach (var key in sortedQueryArray) { canonicalizedResource = "" + canonicalizedResource + separator + AlibabaCloud.DarabonbaEncodeUtil.Encoder.PercentEncode(key); if (!AlibabaCloud.TeaUtil.Common.Empty(query.Get(key))) { canonicalizedResource = "" + canonicalizedResource + "=" + AlibabaCloud.DarabonbaEncodeUtil.Encoder.PercentEncode(query.Get(key)); } separator = "&"; } } return canonicalizedResource; } public async Task<string> BuildCanonicalizedResourceForPopAsync(Dictionary<string, string> query) { string canonicalizedResource = ""; if (!AlibabaCloud.TeaUtil.Common.IsUnset(query)) { List<string> queryArray = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(query); List<string> sortedQueryArray = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(queryArray); string separator = ""; foreach (var key in sortedQueryArray) { canonicalizedResource = "" + canonicalizedResource + separator + AlibabaCloud.DarabonbaEncodeUtil.Encoder.PercentEncode(key); if (!AlibabaCloud.TeaUtil.Common.Empty(query.Get(key))) { canonicalizedResource = "" + canonicalizedResource + "=" + AlibabaCloud.DarabonbaEncodeUtil.Encoder.PercentEncode(query.Get(key)); } separator = "&"; } } return canonicalizedResource; } public string BuildCanonicalizedHeadersForPop(Dictionary<string, string> headers) { string canonicalizedHeaders = ""; List<string> sortedHeaders = GetSignedHeaders(headers); foreach (var header in sortedHeaders) { canonicalizedHeaders = "" + canonicalizedHeaders + header + ":" + AlibabaCloud.DarabonbaString.StringUtil.Trim(headers.Get(header)) + "\n"; } return canonicalizedHeaders; } public async Task<string> BuildCanonicalizedHeadersForPopAsync(Dictionary<string, string> headers) { string canonicalizedHeaders = ""; List<string> sortedHeaders = await GetSignedHeadersAsync(headers); foreach (var header in sortedHeaders) { canonicalizedHeaders = "" + canonicalizedHeaders + header + ":" + AlibabaCloud.DarabonbaString.StringUtil.Trim(headers.Get(header)) + "\n"; } return canonicalizedHeaders; } public List<string> GetSignedHeaders(Dictionary<string, string> headers) { List<string> headersArray = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(headers); List<string> sortedHeadersArray = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(headersArray); string tmp = ""; string separator = ""; foreach (var key in sortedHeadersArray) { string lowerKey = AlibabaCloud.DarabonbaString.StringUtil.ToLower(key); if (AlibabaCloud.DarabonbaString.StringUtil.HasPrefix(lowerKey, "x-acs-") || AlibabaCloud.DarabonbaString.StringUtil.Equals(lowerKey, "host") || AlibabaCloud.DarabonbaString.StringUtil.Equals(lowerKey, "content-type")) { if (!AlibabaCloud.DarabonbaString.StringUtil.Contains(tmp, lowerKey)) { tmp = "" + tmp + separator + lowerKey; separator = ";"; } } } return AlibabaCloud.DarabonbaString.StringUtil.Split(tmp, ";", null); } public async Task<List<string>> GetSignedHeadersAsync(Dictionary<string, string> headers) { List<string> headersArray = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(headers); List<string> sortedHeadersArray = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(headersArray); string tmp = ""; string separator = ""; foreach (var key in sortedHeadersArray) { string lowerKey = AlibabaCloud.DarabonbaString.StringUtil.ToLower(key); if (AlibabaCloud.DarabonbaString.StringUtil.HasPrefix(lowerKey, "x-acs-") || AlibabaCloud.DarabonbaString.StringUtil.Equals(lowerKey, "host") || AlibabaCloud.DarabonbaString.StringUtil.Equals(lowerKey, "content-type")) { if (!AlibabaCloud.DarabonbaString.StringUtil.Contains(tmp, lowerKey)) { tmp = "" + tmp + separator + lowerKey; separator = ";"; } } } return AlibabaCloud.DarabonbaString.StringUtil.Split(tmp, ";", null); } public Dictionary<string, object> SignRequest(HttpRequest request, Aliyun.Credentials.Client credential) { HttpRequest httpRequest = new HttpRequest { Method = request.Method, Path = request.Path, Headers = request.Headers, Body = request.Body, ReqBodyType = request.ReqBodyType, }; httpRequest.Headers["date"] = AlibabaCloud.TeaUtil.Common.GetDateUTCString(); httpRequest.Headers["accept"] = "application/json"; httpRequest.Headers["content-type"] = "application/json"; if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body)) { if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "json")) { httpRequest.Headers["content-type"] = "application/json"; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "form")) { httpRequest.Headers["content-type"] = "application/x-www-form-urlencoded"; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "binary")) { httpRequest.Headers["content-type"] = "application/octet-stream"; } } string accessKeyId = credential.GetAccessKeyId(); string accessKeySecret = credential.GetAccessKeySecret(); string securityToken = credential.GetSecurityToken(); if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken)) { httpRequest.Headers["x-fc-security-token"] = securityToken; } string resource = request.Path; object contentMd5 = httpRequest.Headers.Get("content-md5"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentMd5)) { contentMd5 = ""; } object contentType = httpRequest.Headers.Get("content-type"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentType)) { contentType = ""; } string stringToSign = ""; string canonicalizedResource = BuildCanonicalizedResource(resource); string canonicalizedHeaders = BuildCanonicalizedHeaders(httpRequest.Headers); stringToSign = "" + request.Method + "\n" + AlibabaCloud.TeaUtil.Common.ToJSONString(contentMd5) + "\n" + AlibabaCloud.TeaUtil.Common.ToJSONString(contentType) + "\n" + AlibabaCloud.TeaUtil.Common.ToJSONString(httpRequest.Headers.Get("date")) + "\n" + canonicalizedHeaders + canonicalizedResource; string signature = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSHA256Sign(stringToSign, accessKeySecret)); httpRequest.Headers["Authorization"] = "FC " + accessKeyId + ":" + signature; return httpRequest.Headers; } public async Task<Dictionary<string, object>> SignRequestAsync(HttpRequest request, Aliyun.Credentials.Client credential) { HttpRequest httpRequest = new HttpRequest { Method = request.Method, Path = request.Path, Headers = request.Headers, Body = request.Body, ReqBodyType = request.ReqBodyType, }; httpRequest.Headers["date"] = AlibabaCloud.TeaUtil.Common.GetDateUTCString(); httpRequest.Headers["accept"] = "application/json"; httpRequest.Headers["content-type"] = "application/json"; if (!AlibabaCloud.TeaUtil.Common.IsUnset(request.Body)) { if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "json")) { httpRequest.Headers["content-type"] = "application/json"; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "form")) { httpRequest.Headers["content-type"] = "application/x-www-form-urlencoded"; } else if (AlibabaCloud.TeaUtil.Common.EqualString(request.ReqBodyType, "binary")) { httpRequest.Headers["content-type"] = "application/octet-stream"; } } string accessKeyId = await credential.GetAccessKeyIdAsync(); string accessKeySecret = await credential.GetAccessKeySecretAsync(); string securityToken = await credential.GetSecurityTokenAsync(); if (!AlibabaCloud.TeaUtil.Common.Empty(securityToken)) { httpRequest.Headers["x-fc-security-token"] = securityToken; } string resource = request.Path; object contentMd5 = httpRequest.Headers.Get("content-md5"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentMd5)) { contentMd5 = ""; } object contentType = httpRequest.Headers.Get("content-type"); if (AlibabaCloud.TeaUtil.Common.IsUnset(contentType)) { contentType = ""; } string stringToSign = ""; string canonicalizedResource = await BuildCanonicalizedResourceAsync(resource); string canonicalizedHeaders = await BuildCanonicalizedHeadersAsync(httpRequest.Headers); stringToSign = "" + request.Method + "\n" + AlibabaCloud.TeaUtil.Common.ToJSONString(contentMd5) + "\n" + AlibabaCloud.TeaUtil.Common.ToJSONString(contentType) + "\n" + AlibabaCloud.TeaUtil.Common.ToJSONString(httpRequest.Headers.Get("date")) + "\n" + canonicalizedHeaders + canonicalizedResource; string signature = AlibabaCloud.DarabonbaEncodeUtil.Encoder.Base64EncodeToString(AlibabaCloud.DarabonbaSignatureUtil.Signer.HmacSHA256Sign(stringToSign, accessKeySecret)); httpRequest.Headers["Authorization"] = "FC " + accessKeyId + ":" + signature; return httpRequest.Headers; } public string BuildCanonicalizedResource(string pathname) { List<string> paths = AlibabaCloud.DarabonbaString.StringUtil.Split(pathname, "?", 2); string canonicalizedResource = paths[0]; List<string> resources = new List<string> { }; if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(paths), 2)) { resources = AlibabaCloud.DarabonbaString.StringUtil.Split(paths[1], "&", null); } List<string> sortedParams = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(resources); if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(sortedParams), 0)) { return "" + canonicalizedResource + "\n"; } string subResources = AlibabaCloud.DarabonbaArray.ArrayUtil.Join(sortedParams, "\n"); return "" + canonicalizedResource + "\n" + subResources; } public async Task<string> BuildCanonicalizedResourceAsync(string pathname) { List<string> paths = AlibabaCloud.DarabonbaString.StringUtil.Split(pathname, "?", 2); string canonicalizedResource = paths[0]; List<string> resources = new List<string> { }; if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(paths), 2)) { resources = AlibabaCloud.DarabonbaString.StringUtil.Split(paths[1], "&", null); } List<string> sortedParams = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(resources); if (AlibabaCloud.TeaUtil.Common.EqualNumber(AlibabaCloud.DarabonbaArray.ArrayUtil.Size(sortedParams), 0)) { return "" + canonicalizedResource + "\n"; } string subResources = AlibabaCloud.DarabonbaArray.ArrayUtil.Join(sortedParams, "\n"); return "" + canonicalizedResource + "\n" + subResources; } public string BuildCanonicalizedHeaders(Dictionary<string, object> headers) { string canonicalizedHeaders = ""; List<string> keys = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(headers); List<string> sortedHeaders = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(keys); foreach (var header in sortedHeaders) { if (AlibabaCloud.DarabonbaString.StringUtil.Contains(AlibabaCloud.DarabonbaString.StringUtil.ToLower(header), "x-fc-")) { canonicalizedHeaders = "" + canonicalizedHeaders + AlibabaCloud.DarabonbaString.StringUtil.ToLower(header) + ":" + AlibabaCloud.TeaUtil.Common.ToJSONString(headers.Get(header)) + "\n"; } } return canonicalizedHeaders; } public async Task<string> BuildCanonicalizedHeadersAsync(Dictionary<string, object> headers) { string canonicalizedHeaders = ""; List<string> keys = AlibabaCloud.DarabonbaMap.MapUtil.KeySet(headers); List<string> sortedHeaders = AlibabaCloud.DarabonbaArray.ArrayUtil.AscSort(keys); foreach (var header in sortedHeaders) { if (AlibabaCloud.DarabonbaString.StringUtil.Contains(AlibabaCloud.DarabonbaString.StringUtil.ToLower(header), "x-fc-")) { canonicalizedHeaders = "" + canonicalizedHeaders + AlibabaCloud.DarabonbaString.StringUtil.ToLower(header) + ":" + AlibabaCloud.TeaUtil.Common.ToJSONString(headers.Get(header)) + "\n"; } } return canonicalizedHeaders; } } }