UriExtensions
Extension methods used to manipulate URIs.
            
                using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Text;
namespace Azure.Storage
{
    internal static class UriExtensions
    {
        public static Uri AppendToPath(this Uri uri, string segment)
        {
            UriBuilder uriBuilder = new UriBuilder(uri);
            string path = uriBuilder.Path;
            string str = (path.Length == 0 || path[path.Length - 1] != '/') ? "/" : "";
            segment = segment.Replace("%", "%25");
            uriBuilder.Path = uriBuilder.Path + str + segment;
            return uriBuilder.Uri;
        }
        public static IDictionary<string, string> GetQueryParameters(this Uri uri)
        {
            Dictionary<string, string> dictionary = new Dictionary<string, string>();
            string text = uri.Query ?? "";
            if (!string.IsNullOrEmpty(text)) {
                if (text.StartsWith("?", true, CultureInfo.InvariantCulture))
                    text = text.Substring(1);
                string[] array = text.Split(new char[1] {
                    '&'
                }, StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < array.Length; i++) {
                    string[] array2 = array[i].Split(new char[1] {
                        '='
                    }, 2);
                    string key = WebUtility.UrlDecode(array2[0]);
                    if (array2.Length == 1)
                        dictionary.Add(key, null);
                    else
                        dictionary.Add(key, WebUtility.UrlDecode(array2[1]));
                }
            }
            return dictionary;
        }
        public static string GetAccountNameFromDomain(this Uri uri, string serviceSubDomain)
        {
            return GetAccountNameFromDomain(uri.Host, serviceSubDomain);
        }
        public static string GetAccountNameFromDomain(string host, string serviceSubDomain)
        {
            int num = host.IndexOf(".", StringComparison.InvariantCulture);
            if (num >= 0) {
                if (host.IndexOf(serviceSubDomain, num, StringComparison.InvariantCulture) <= -1)
                    return null;
                return host.Substring(0, num);
            }
            return null;
        }
        public static string GetPath(this Uri uri)
        {
            if (uri.AbsolutePath[0] != '/')
                return uri.AbsolutePath;
            return uri.AbsolutePath.Substring(1);
        }
        public static bool IsHostIPEndPointStyle(this Uri uri)
        {
            if (string.IsNullOrEmpty(uri.Host) || uri.Host.IndexOf(".", StringComparison.InvariantCulture) < 0 || !IPAddress.TryParse(uri.Host, out IPAddress _))
                return Azure.Storage.Constants.Sas.PathStylePorts.Contains(uri.Port);
            return true;
        }
        internal static void AppendQueryParameter(this StringBuilder sb, string key, string value)
        {
            sb.Append((sb.Length > 0) ? "&" : "").Append(key).Append('=')
                .Append(value);
        }
    }
}