StorageClientOptions
Defines the client configuration options for connecting to Azure
            Storage.
            
                using Azure.Core;
using Azure.Core.Pipeline;
using Azure.Storage.Common;
using Azure.Storage.Shared;
using System;
namespace Azure.Storage
{
    internal static class StorageClientOptions
    {
        private const string StorageScope = "https://storage.azure.com/.default";
        public static void Initialize(this ClientOptions options)
        {
            options.get_Retry().set_MaxRetries(5);
        }
        public static HttpPipelinePolicy (this StorageSharedKeyCredential credential)
        {
            if (credential == null)
                throw Errors.ArgumentNull("credential");
            return new StorageSharedKeyPipelinePolicy(credential);
        }
        public static HttpPipelinePolicy AsPolicy<TUriBuilder>(this AzureSasCredential credential, Uri resourceUri)
        {
            Argument.AssertNotNull(resourceUri, "resourceUri");
            Argument.AssertNotNull<AzureSasCredential>(credential, "credential");
            if (resourceUri.GetQueryParameters().ContainsKey("sig"))
                throw Errors.SasCredentialRequiresUriWithoutSas<TUriBuilder>(resourceUri);
            return new AzureSasCredentialSynchronousPolicy(credential);
        }
        public static HttpPipelinePolicy AsPolicy(this TokenCredential credential, string scope, ClientOptions options)
        {
            if (credential == null)
                throw Errors.ArgumentNull("credential");
            return new StorageBearerTokenChallengeAuthorizationPolicy(credential, scope ?? "https://storage.azure.com/.default", (options as ISupportsTenantIdChallenges)?.EnableTenantDiscovery ?? false);
        }
        public static HttpPipelinePolicy GetAuthenticationPolicy(object credentials = null, string scope = null, ClientOptions options = null)
        {
            if (credentials is SharedAccessSignatureCredentials || credentials == null)
                return null;
            StorageSharedKeyCredential val = credentials as StorageSharedKeyCredential;
            if (val != null)
                return val.AsPolicy();
            TokenCredential val2 = credentials as TokenCredential;
            if (val2 != null)
                return val2.AsPolicy(scope, options);
            AzureSasCredential val3 = credentials as AzureSasCredential;
            if (val3 != null)
                return new AzureSasCredentialSynchronousPolicy(val3);
            throw Errors.InvalidCredentials(credentials.GetType().FullName);
        }
        public static HttpPipeline Build(this ClientOptions options, HttpPipelinePolicy authentication = null, Uri geoRedundantSecondaryStorageUri = null, Request100ContinueOptions expectContinue = null)
        {
            StorageResponseClassifier storageResponseClassifier = new StorageResponseClassifier();
            HttpPipelineOptions val = new HttpPipelineOptions(options);
            val.get_PerCallPolicies().Add(StorageServerTimeoutPolicy.Shared);
            val.get_PerRetryPolicies().Add(StorageTelemetryPolicy.Shared);
            val.set_ResponseClassifier(storageResponseClassifier);
            val.set_RequestFailedDetailsParser(new StorageRequestFailedDetailsParser());
            HttpPipelineOptions val2 = val;
            if (geoRedundantSecondaryStorageUri != (Uri)null) {
                val2.get_PerRetryPolicies().Add(new GeoRedundantReadPolicy(geoRedundantSecondaryStorageUri));
                storageResponseClassifier.SecondaryStorageUri = geoRedundantSecondaryStorageUri;
            }
            if (expectContinue != null) {
                Request100ContinueMode mode = expectContinue.get_Mode();
                switch ((int)mode) {
                case 0:
                    val2.get_PerCallPolicies().Add(new ExpectContinueOnThrottlePolicy {
                        ThrottleInterval = expectContinue.get_AutoInterval(),
                        ContentLengthThreshold = expectContinue.get_ContentLengthThreshold().GetValueOrDefault()
                    });
                    break;
                case 1:
                    val2.get_PerCallPolicies().Add(new ExpectContinuePolicy {
                        ContentLengthThreshold = expectContinue.get_ContentLengthThreshold().GetValueOrDefault()
                    });
                    break;
                }
            } else
                val2.get_PerCallPolicies().Add(new ExpectContinueOnThrottlePolicy {
                    ThrottleInterval = TimeSpan.FromMinutes(1)
                });
            val2.get_PerRetryPolicies().Add(new StorageRequestValidationPipelinePolicy());
            val2.get_PerRetryPolicies().Add(authentication);
            return HttpPipelineBuilder.Build(val2);
        }
        public static HttpPipeline Build(this ClientOptions options, object credentials, Uri geoRedundantSecondaryStorageUri = null, Request100ContinueOptions expectContinue = null)
        {
            return options.Build(GetAuthenticationPolicy(credentials, null, null), geoRedundantSecondaryStorageUri, expectContinue);
        }
    }
}