/// <summary>
        /// Initializes a new instance of the <see cref="TableServiceClient"/> using the specified connection string.
        /// </summary>
        /// <param name="connectionString">
        /// A connection string includes the authentication information
        /// required for your application to access data in an Azure Storage
        /// account at runtime.
        ///
        /// For more information,
        /// <see href="https://docs.microsoft.com/azure/storage/common/storage-configure-connection-string">
        /// Configure Azure Storage connection strings</see>.
        /// </param>
        /// <param name="options">
        /// Optional client options that define the transport pipeline policies for authentication, retries, etc., that are applied to every request.
        /// </param>
        public TableServiceClient(string connectionString, TableClientOptions options = null)
        {
            Argument.AssertNotNull(connectionString, nameof(connectionString));

            TableConnectionString connString = TableConnectionString.Parse(connectionString);

            _accountName = connString._accountName;

            options ??= new TableClientOptions();
            var endpointString    = connString.TableStorageUri.PrimaryUri.AbsoluteUri;
            var secondaryEndpoint = connString.TableStorageUri.SecondaryUri?.AbsoluteUri;

            _isCosmosEndpoint = TableServiceClient.IsPremiumEndpoint(connString.TableStorageUri.PrimaryUri);
            var perCallPolicies = _isCosmosEndpoint ? new[] { new CosmosPatchTransformPolicy() } : Array.Empty <HttpPipelinePolicy>();

            TableSharedKeyPipelinePolicy policy = connString.Credentials switch
            {
                TableSharedKeyCredential credential => new TableSharedKeyPipelinePolicy(credential),
                _ => default
            };
            HttpPipeline pipeline = HttpPipelineBuilder.Build(options, perCallPolicies: perCallPolicies, perRetryPolicies: new[] { policy }, new ResponseClassifier());

            _version                    = options.VersionString;
            _diagnostics                = new ClientDiagnostics(options);
            _tableOperations            = new TableRestClient(_diagnostics, pipeline, endpointString, _version);
            _serviceOperations          = new ServiceRestClient(_diagnostics, pipeline, endpointString, _version);
            _secondaryServiceOperations = new ServiceRestClient(_diagnostics, pipeline, secondaryEndpoint, _version);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="TableServiceClient"/> using the specified connection string.
        /// </summary>
        /// <param name="connectionString">
        /// A connection string includes the authentication information
        /// required for your application to access data in an Azure Storage
        /// account at runtime.
        ///
        /// For more information,
        /// <see href="https://docs.microsoft.com/azure/storage/common/storage-configure-connection-string">
        /// Configure Azure Storage connection strings</see>.
        /// </param>
        /// <param name="options">
        /// Optional client options that define the transport pipeline policies for authentication, retries, etc., that are applied to every request.
        /// </param>
        public TableServiceClient(string connectionString, TableClientOptions options = null)
        {
            Argument.AssertNotNull(connectionString, nameof(connectionString));

            TableConnectionString connString = TableConnectionString.Parse(connectionString);

            options ??= new TableClientOptions();
            var endpointString    = connString.TableStorageUri.PrimaryUri.AbsoluteUri;
            var secondaryEndpoint = connString.TableStorageUri.SecondaryUri?.AbsoluteUri;

            TableSharedKeyPipelinePolicy policy = connString.Credentials switch
            {
                TableSharedKeyCredential credential => new TableSharedKeyPipelinePolicy(credential),
                _ => default
            };
            HttpPipeline pipeline = HttpPipelineBuilder.Build(options, policy);

            _version                    = options.VersionString;
            _diagnostics                = new ClientDiagnostics(options);
            _tableOperations            = new TableRestClient(_diagnostics, pipeline, endpointString, _version);
            _serviceOperations          = new ServiceRestClient(_diagnostics, pipeline, endpointString, _version);
            _secondaryServiceOperations = new ServiceRestClient(_diagnostics, pipeline, secondaryEndpoint, _version);
            _isPremiumEndpoint          = IsPremiumEndpoint(connString.TableStorageUri.PrimaryUri);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="TableServiceClient"/> using the specified table service <see cref="Uri" /> and <see cref="TableSharedKeyCredential" />.
 /// </summary>
 /// <param name="endpoint">
 /// A <see cref="Uri"/> referencing the table service account.
 /// This is likely to be similar to "https://{account_name}.table.core.windows.net/" or "https://{account_name}.table.cosmos.azure.com/".
 /// </param>
 /// <param name="credential">The shared key credential used to sign requests.</param>
 /// <param name="options">
 /// Optional client options that define the transport pipeline policies for authentication, retries, etc., that are applied to every request.
 /// </param>
 public TableServiceClient(Uri endpoint, TableSharedKeyCredential credential, TableClientOptions options = null)
     : this(endpoint, new TableSharedKeyPipelinePolicy(credential), default, options)
 {
     Argument.AssertNotNull(credential, nameof(credential));
 }
 /// <summary>
 /// Create a new SharedKeyPipelinePolicy
 /// </summary>
 /// <param name="credentials">SharedKeyCredentials to authenticate requests.</param>
 public TableSharedKeyPipelinePolicy(TableSharedKeyCredential credentials)
 => _credentials = credentials;
 public static string GetSas(TableSharedKeyCredential credential, string message)
 {
     return(ComputeSasSignature(credential, message));
 }