Amazon.Runtime.Internal.Auth.AWS4Signer.DetermineSigningRegion C# (CSharp) Method

DetermineSigningRegion() public static method

public static DetermineSigningRegion ( IClientConfig clientConfig, string serviceName, RegionEndpoint alternateEndpoint, IRequest request ) : string
clientConfig IClientConfig
serviceName string
alternateEndpoint RegionEndpoint
request IRequest
return string
        public static string DetermineSigningRegion(IClientConfig clientConfig, 
                                                    string serviceName, 
                                                    RegionEndpoint alternateEndpoint,
                                                    IRequest request)
        {
            // Alternate endpoint (IRequest.AlternateEndopoint) takes precedence over
            // client config properties.
            if (alternateEndpoint != null)
            {
                var serviceEndpoint = alternateEndpoint.GetEndpointForService(serviceName, clientConfig.UseDualstackEndpoint);
                if (serviceEndpoint.AuthRegion != null)
                    return serviceEndpoint.AuthRegion;

                return alternateEndpoint.SystemName;
            }

            string authenticationRegion = clientConfig.AuthenticationRegion;
            if (request != null && request.AuthenticationRegion != null)
                authenticationRegion = request.AuthenticationRegion;

            if (!string.IsNullOrEmpty(authenticationRegion))
                return authenticationRegion.ToLowerInvariant();

            if (!string.IsNullOrEmpty(clientConfig.ServiceURL))
            {
                var parsedRegion = AWSSDKUtils.DetermineRegion(clientConfig.ServiceURL);
                if (!string.IsNullOrEmpty(parsedRegion))
                    return parsedRegion.ToLowerInvariant();
            }

            var endpoint = clientConfig.RegionEndpoint;
            if (endpoint != null)
            {
                var serviceEndpoint = endpoint.GetEndpointForService(serviceName, clientConfig.UseDualstackEndpoint);
                if (!string.IsNullOrEmpty(serviceEndpoint.AuthRegion))
                    return serviceEndpoint.AuthRegion;

                return endpoint.SystemName; 
            }

            return string.Empty;
        }

Usage Example

        public static AWS4SigningResult SignRequest(IRequest request, IClientConfig clientConfig, RequestMetrics metrics, string awsAccessKeyId, string awsSecretAccessKey, string service, string overrideSigningRegion)
        {
            request.Headers.Remove("Authorization");
            if (!request.Headers.ContainsKey("host"))
            {
                string text = request.Endpoint.Host;
                if (!request.Endpoint.IsDefaultPort)
                {
                    text = text + ":" + request.Endpoint.Port;
                }
                request.Headers.Add("host", text);
            }
            DateTime correctedUtcNow = AWSSDKUtils.CorrectedUtcNow;
            string   text2           = overrideSigningRegion ?? AWS4Signer.DetermineSigningRegion(clientConfig, service, request.AlternateEndpoint, request);

            if (request.Headers.ContainsKey("X-Amz-Content-SHA256"))
            {
                request.Headers.Remove("X-Amz-Content-SHA256");
            }
            IDictionary <string, string> sortedHeaders = AWS4Signer.SortHeaders(request.Headers);
            string text3 = AWS4Signer.CanonicalizeHeaderNames(sortedHeaders);
            IDictionary <string, string> parametersToCanonicalize = AWS4Signer.GetParametersToCanonicalize(request);

            parametersToCanonicalize.Add("X-Amz-Algorithm", "AWS4-HMAC-SHA256");
            parametersToCanonicalize.Add("X-Amz-Credential", string.Format(CultureInfo.InvariantCulture, "{0}/{1}/{2}/{3}/{4}", awsAccessKeyId, AWS4Signer.FormatDateTime(correctedUtcNow, "yyyyMMdd"), text2, service, "aws4_request"));
            parametersToCanonicalize.Add("X-Amz-Date", AWS4Signer.FormatDateTime(correctedUtcNow, "yyyyMMddTHHmmssZ"));
            parametersToCanonicalize.Add("X-Amz-SignedHeaders", text3);
            string canonicalQueryString = AWS4Signer.CanonicalizeQueryParameters(parametersToCanonicalize);
            string text4 = AWS4Signer.CanonicalizeRequest(request.Endpoint, request.ResourcePath, request.HttpMethod, sortedHeaders, canonicalQueryString, (service == "s3") ? "UNSIGNED-PAYLOAD" : "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");

            metrics?.AddProperty(Metric.CanonicalRequest, text4);
            return(AWS4Signer.ComputeSignature(awsAccessKeyId, awsSecretAccessKey, text2, correctedUtcNow, service, text3, text4, metrics));
        }