< Summary

Class:Azure.Data.Tables.Sas.TableSasExtensions
Assembly:Azure.Data.Tables
File(s):C:\Git\azure-sdk-for-net\sdk\tables\Azure.Data.Tables\src\Sas\TableSasExtensions.cs
Covered lines:26
Uncovered lines:26
Coverable lines:52
Total lines:190
Line coverage:50% (26 of 52)
Covered branches:23
Total branches:50
Branch coverage:46% (23 of 50)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
ToProtocolString(...)-33.33%50%
ParseProtocol(...)-0%0%
ParseResourceTypes(...)-0%0%
FormatTimesForSasSigning(...)-100%100%
AddToBuilder(...)-0%0%
AppendProperties(...)-79.17%77.27%
AppendQueryParameter(...)-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\tables\Azure.Data.Tables\src\Sas\TableSasExtensions.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using System;
 5using System.Globalization;
 6using System.Net;
 7using System.Text;
 8
 9namespace Azure.Data.Tables.Sas
 10{
 11    /// <summary>
 12    /// Extension methods for Sas.
 13    /// </summary>
 14    internal static partial class TableSasExtensions
 15    {
 16        private const string NoneName = null;
 17        private const string HttpsName = "https";
 18        private const string HttpsAndHttpName = "https,http";
 19
 20        /// <summary>
 21        /// Gets a string representation of the protocol.
 22        /// </summary>
 23        /// <returns>A string representation of the protocol.</returns>
 24        internal static string ToProtocolString(this TableSasProtocol protocol)
 25        {
 26            switch (protocol)
 27            {
 28                case TableSasProtocol.Https:
 029                    return HttpsName;
 30                case TableSasProtocol.HttpsAndHttp:
 031                    return HttpsAndHttpName;
 32                case TableSasProtocol.None:
 33                default:
 4034                    return null;
 35            }
 36        }
 37
 38        /// <summary>
 39        /// Parse a string representation of a protocol.
 40        /// </summary>
 41        /// <param name="s">A string representation of a protocol.</param>
 42        /// <returns>A <see cref="TableSasProtocol"/>.</returns>
 43        public static TableSasProtocol ParseProtocol(string s)
 44        {
 45            switch (s)
 46            {
 47                case NoneName:
 48                case "":
 049                    return TableSasProtocol.None;
 50                case HttpsName:
 051                    return TableSasProtocol.Https;
 52                case HttpsAndHttpName:
 053                    return TableSasProtocol.HttpsAndHttp;
 54                default:
 055                    throw Errors.InvalidSasProtocol(nameof(s), nameof(TableSasProtocol));
 56            }
 57        }
 58
 59        /// <summary>
 60        /// Parse a string representing which resource types are accessible
 61        /// from a shared access signature.
 62        /// </summary>
 63        /// <param name="s">
 64        /// A string representing which resource types are accessible.
 65        /// </param>
 66        /// <returns>
 67        /// An <see cref="TableAccountSasResourceTypes"/> instance.
 68        /// </returns>
 69        /// <remarks>
 70        /// The order here matches the order used by the portal when generating SAS signatures.
 71        /// </remarks>
 72        internal static TableAccountSasResourceTypes ParseResourceTypes(string s)
 73        {
 074            TableAccountSasResourceTypes types = default;
 075            foreach (var ch in s)
 76            {
 077                types |= ch switch
 078                {
 079                    TableConstants.Sas.TableAccountResources.Service => TableAccountSasResourceTypes.Service,
 080                    TableConstants.Sas.TableAccountResources.Container => TableAccountSasResourceTypes.Container,
 081                    TableConstants.Sas.TableAccountResources.Object => TableAccountSasResourceTypes.Object,
 082                    _ => throw Errors.InvalidResourceType(ch),
 083                };
 84            }
 085            return types;
 86        }
 87
 88        /// <summary>
 89        /// FormatTimesForSASSigning converts a time.Time to a snapshotTimeFormat string suitable for a
 90        /// SASField's StartTime or ExpiryTime fields. Returns "" if value.IsZero().
 91        /// </summary>
 92        /// <param name="time"></param>
 93        /// <returns></returns>
 94        internal static string FormatTimesForSasSigning(DateTimeOffset time) =>
 95            // "yyyy-MM-ddTHH:mm:ssZ"
 8096            (time == new DateTimeOffset()) ? "" : time.ToString(TableConstants.Sas.SasTimeFormat, CultureInfo.InvariantC
 97
 98        /// <summary>
 99        /// Helper method to add query param key value pairs to StringBuilder
 100        /// </summary>
 101        /// <param name="sb">StringBuilder instance</param>
 102        /// <param name="key">query key</param>
 103        /// <param name="value">query value</param>
 104        internal static void AddToBuilder(StringBuilder sb, string key, string value) =>
 0105            sb
 0106            .Append(sb.Length > 0 ? "&" : "")
 0107            .Append(key)
 0108            .Append('=')
 0109            .Append(value);
 110
 111        /// <summary>
 112        /// Builds the query parameter string for the SasQueryParameters instance.
 113        /// </summary>
 114        /// <param name="parameters"></param>
 115        /// <param name="stringBuilder">
 116        /// StringBuilder instance to add the query params to
 117        /// </param>
 118        internal static void AppendProperties(this TableAccountSasQueryParameters parameters, StringBuilder stringBuilde
 119        {
 40120            if (!string.IsNullOrWhiteSpace(parameters.Version))
 121            {
 40122                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Version, parameters.Version);
 123            }
 124
 40125            if (!(parameters is TableSasQueryParameters))
 126            {
 32127                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Services, TableConstants.Sas.TableAccou
 128            }
 129
 40130            if (parameters.ResourceTypes != null)
 131            {
 32132                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.ResourceTypes, parameters.ResourceTypes
 133            }
 134
 40135            if (parameters.Protocol != default)
 136            {
 0137                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Protocol, parameters.Protocol.ToProtoco
 138            }
 139
 40140            if (parameters.StartsOn != DateTimeOffset.MinValue)
 141            {
 0142                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.StartTime, WebUtility.UrlEncode(paramet
 143            }
 144
 40145            if (parameters.ExpiresOn != DateTimeOffset.MinValue)
 146            {
 40147                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.ExpiryTime, WebUtility.UrlEncode(parame
 148            }
 149
 40150            var ipr = parameters.IPRange.ToString();
 40151            if (ipr.Length > 0)
 152            {
 0153                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.IPRange, ipr);
 154            }
 155
 40156            if (!string.IsNullOrWhiteSpace(parameters.Identifier))
 157            {
 0158                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Identifier, parameters.Identifier);
 159            }
 160
 40161            if (!string.IsNullOrWhiteSpace(parameters.Resource))
 162            {
 0163                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Resource, parameters.Resource);
 164            }
 165
 40166            if (!string.IsNullOrWhiteSpace(parameters.Permissions))
 167            {
 40168                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Permissions, parameters.Permissions);
 169            }
 170
 40171            if (!string.IsNullOrWhiteSpace(parameters.Signature))
 172            {
 40173                stringBuilder.AppendQueryParameter(TableConstants.Sas.Parameters.Signature, WebUtility.UrlEncode(paramet
 174            }
 40175        }
 176
 177        /// <summary>
 178        /// Appends a query parameter to the string builder.
 179        /// </summary>
 180        /// <param name="sb">string builder instance.</param>
 181        /// <param name="key">query parameter key.</param>
 182        /// <param name="value">query parameter value.</param>
 183        internal static void AppendQueryParameter(this StringBuilder sb, string key, string value) =>
 232184            sb
 232185            .Append(sb.Length > 0 ? "&" : "")
 232186            .Append(key)
 232187            .Append('=')
 232188            .Append(value);
 189    }
 190}