public static void ProcessRequestHandlers(IExecutionContext executionContext)
        {
            var    request = executionContext.RequestContext.Request;
            var    config  = executionContext.RequestContext.ClientConfig;
            string nonArnOutpostId;
            Arn    s3Arn;

            if (S3ArnUtils.RequestContainsArn(request, out s3Arn))
            {
                IS3Resource s3Resource = null;
                if (s3Arn.IsOutpostArn())
                {
                    if (!s3Arn.IsValidService())
                    {
                        throw new AmazonClientException($"Invalid ARN: {s3Arn.ToString()}, not S3 Outposts ARN");
                    }
                    s3Resource = s3Arn.ParseOutpost();
                    request.Headers[HeaderKeys.XAmzOutpostId] = ((S3OutpostResource)s3Resource).OutpostId;
                }
                if (s3Resource != null)
                {
                    s3Resource.ValidateArnWithClientConfig(config);
                    request.Endpoint = s3Resource.GetEndpoint(config);
                    request.UseSigV4 = true;
                    request.CanonicalResourcePrefix    = string.Concat("/", s3Resource.FullResourceName);
                    request.OverrideSigningServiceName = s3Arn.Service;
                    // The access point arn can be using a region different from the configured region for the service client.
                    // If so be sure to set the authentication region so the signer will use the correct region.
                    request.AuthenticationRegion = s3Arn.Region;
                    request.Headers[HeaderKeys.XAmzAccountId] = s3Arn.AccountId;
                    // replace the ARNs in the resource path or query params with the extracted name of the resource
                    // These methods assume that there is max 1 Arn in the PathResources or Parameters
                    S3ArnUtils.ReplacePathResourceArns(request.PathResources, s3Resource.Name);
                    S3ArnUtils.ReplacePathResourceArns(request.Parameters, s3Resource.Name);
                }
            }
            else if (S3ArnUtils.DoesRequestHaveOutpostId(request.OriginalRequest, out nonArnOutpostId))
            {
                if (!S3ArnUtils.IsValidOutpostId(nonArnOutpostId))
                {
                    throw new AmazonClientException($"Invalid outpost ID. ID must contain only alphanumeric characters and dashes");
                }
                request.OverrideSigningServiceName = S3ArnUtils.S3OutpostsService;
                request.Endpoint = S3ArnUtils.GetNonStandardOutpostIdEndpoint(config);
                request.Headers[HeaderKeys.XAmzOutpostId] = nonArnOutpostId;
            }
        }
        public static void ProcessRequestHandlers(IExecutionContext executionContext)
        {
            var request = executionContext.RequestContext.Request;
            var config  = executionContext.RequestContext.ClientConfig;

            //If a ServiceURL is set the config ClientRegion should be null. Under this case
            //the region needs to be determined from the ServiceURL.
            RegionEndpoint useRegion = config.RegionEndpoint;

            if (useRegion == null && !string.IsNullOrEmpty(config.ServiceURL))
            {
                var regionName = AWSSDKUtils.DetermineRegion(config.ServiceURL);
                useRegion = RegionEndpoint.GetBySystemName(regionName);
            }

            string nonArnOutpostId;
            Arn    s3Arn;

            if (S3ArnUtils.RequestContainsArn(request, out s3Arn))
            {
                IS3Resource s3Resource = null;
                if (!s3Arn.HasValidAccountId())
                {
                    throw new AmazonAccountIdException();
                }
                if (s3Arn.IsOutpostArn())
                {
                    if (!s3Arn.IsValidService())
                    {
                        throw new AmazonClientException($"Invalid ARN: {s3Arn.ToString()}, not S3 Outposts ARN");
                    }
                    s3Resource = s3Arn.ParseOutpost(config as AmazonS3ControlConfig);

                    request.Headers[HeaderKeys.XAmzOutpostId] = ((S3OutpostResource)s3Resource).OutpostId;
                }
                if (s3Resource != null)
                {
                    s3Resource.ValidateArnWithClientConfig(config, useRegion);
                    if (string.IsNullOrEmpty(config.ServiceURL))
                    {
                        request.Endpoint = s3Resource.GetEndpoint(config);
                    }
                    else
                    {
                        request.Endpoint = new Uri(config.ServiceURL);
                    }
                    request.SignatureVersion           = SignatureVersion.SigV4;
                    request.CanonicalResourcePrefix    = string.Concat("/", s3Resource.FullResourceName);
                    request.OverrideSigningServiceName = s3Arn.Service;
                    // The access point arn can be using a region different from the configured region for the service client.
                    // If so be sure to set the authentication region so the signer will use the correct region.
                    request.AuthenticationRegion = s3Arn.Region;
                    request.Headers[HeaderKeys.XAmzAccountId] = s3Arn.AccountId;
                    // replace the ARNs in the resource path or query params with the extracted name of the resource
                    // These methods assume that there is max 1 Arn in the PathResources or Parameters
                    S3ArnUtils.ReplacePathResourceArns(request.PathResources, s3Resource.Name);
                    S3ArnUtils.ReplacePathResourceArns(request.Parameters, s3Resource.Name);
                }
            }
            else if (S3ArnUtils.DoesRequestHaveOutpostId(request.OriginalRequest, out nonArnOutpostId))
            {
                if (!S3ArnUtils.IsValidOutpostId(nonArnOutpostId))
                {
                    throw new AmazonClientException($"Invalid outpost ID. ID must contain only alphanumeric characters and dashes");
                }
                request.OverrideSigningServiceName = S3ArnUtils.S3OutpostsService;
                if (string.IsNullOrEmpty(config.ServiceURL))
                {
                    request.Endpoint = S3ArnUtils.GetNonStandardOutpostIdEndpoint(config);
                }
                else
                {
                    request.Endpoint = new Uri(config.ServiceURL);
                }
                request.Headers[HeaderKeys.XAmzOutpostId] = nonArnOutpostId;
            }
        }