internal static string CanonicalizedHeaders(HttpRequestHeaders headers)
        {
            var canonicalizedString = new CanonicalizedString(string.Empty);

            var keyList =
                headers.Where(h => h.Key.StartsWith("x-ms-", StringComparison.OrdinalIgnoreCase)).Select(header => header.Key).ToList();

            keyList.Sort();
            foreach (string str2 in keyList)
            {
                var builder = new StringBuilder(str2);
                string str3 = ":";
                foreach (string str4 in GetHeaderValues(headers, str2))
                {
                    string str5 = str4.Replace("\r\n", string.Empty);
                    builder.Append(str3);
                    builder.Append(str5);
                    str3 = ",";
                }

                canonicalizedString.AppendCanonicalizedElement(builder.ToString());
            }

            return canonicalizedString.Value.TrimEnd('\n').TrimStart('\n');
        }
        internal static string GetCanonicalizedResourceVersion2(Uri address, string accountName)
        {
            var builder = new StringBuilder("/");
            builder.Append(accountName);
            builder.Append(address.AbsolutePath);
            var str = new CanonicalizedString(builder.ToString());
            NameValueCollection values = HttpUtility.ParseQueryString(address.Query);
            var values2 = new NameValueCollection();
            foreach (string str2 in values.Keys)
            {
                var list = new ArrayList(values.GetValues(str2));
                list.Sort();
                var builder2 = new StringBuilder();
                foreach (object obj2 in list)
                {
                    if (builder2.Length > 0)
                    {
                        builder2.Append(",");
                    }

                    builder2.Append(obj2.ToString());
                }

                values2.Add((str2 == null) ? str2 : str2.ToLowerInvariant(), builder2.ToString());
            }

            var list2 = new ArrayList(values2.AllKeys);
            list2.Sort();
            foreach (string str3 in list2)
            {
                var builder3 = new StringBuilder(string.Empty);
                builder3.Append(str3);
                builder3.Append(":");
                builder3.Append(values2[str3]);
                str.AppendCanonicalizedElement(builder3.ToString());
            }

            return str.Value;
        }
        internal static void Sign(this HttpRequestMessage request, CloudStorageAccount account)
        {
            string str = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
            var headerName = request.Headers.Where(h => h.Key.Equals("x-ms-date", StringComparison.OrdinalIgnoreCase)).Select(header => header.Key).FirstOrDefault();

            if (!string.IsNullOrEmpty(headerName))
                request.Headers.Remove(headerName);
            request.Headers.Add("x-ms-date", str);

            var canonicalizedString = new CanonicalizedString(request.Method.ToString());

            if (request.Content == null)
            {
                canonicalizedString.AppendCanonicalizedElement(string.Empty);
                canonicalizedString.AppendCanonicalizedElement(string.Empty);

                if (request.Method == HttpMethod.Put || request.Method == HttpMethod.Post || request.Method == HttpMethod.Delete)
                    canonicalizedString.AppendCanonicalizedElement("0");
                else
                {
                    canonicalizedString.AppendCanonicalizedElement(string.Empty);
                }

                canonicalizedString.AppendCanonicalizedElement(string.Empty);
                canonicalizedString.AppendCanonicalizedElement(string.Empty);
            }
            else
            {
                canonicalizedString.AppendCanonicalizedElement(request.Content.Headers.ContentEncoding.ToString());
                canonicalizedString.AppendCanonicalizedElement(request.Content.Headers.ContentLanguage.ToString());
                canonicalizedString.AppendCanonicalizedElement((request.Content.Headers.ContentLength > 0) ? request.Content.Headers.ContentLength.ToString() : string.Empty);

                canonicalizedString.AppendCanonicalizedElement(
                    request.Content.Headers.ContentMD5 != null
                        ? request.Content.Headers.ContentMD5.ToString()
                        : string.Empty);

                canonicalizedString.AppendCanonicalizedElement(request.Content.Headers.ContentType.ToString());
            }

            canonicalizedString.AppendCanonicalizedElement(string.Empty);

            canonicalizedString.AppendCanonicalizedElement(request.Headers.IfModifiedSince.ToString());
            canonicalizedString.AppendCanonicalizedElement(request.Headers.IfMatch.ToString());
            canonicalizedString.AppendCanonicalizedElement(request.Headers.IfNoneMatch.ToString());
            canonicalizedString.AppendCanonicalizedElement(request.Headers.IfUnmodifiedSince.ToString());

            canonicalizedString.AppendCanonicalizedElement(request.Headers.Range != null ? request.Headers.Range.ToString() : string.Empty);

            canonicalizedString.AppendCanonicalizedElement(CanonicalizedHeaders(request.Headers));

            canonicalizedString.AppendCanonicalizedElement(
                GetCanonicalizedResourceVersion2(
                    request.RequestUri, account.Credentials.AccountName).TrimEnd('\n'));

            var stringToSign = canonicalizedString.Value;
            string signedString = account.Credentials.ComputeHmac(stringToSign);

            headerName = request.Headers.Where(h => h.Key.Equals("Authorization", StringComparison.OrdinalIgnoreCase)).Select(header => header.Key).FirstOrDefault();
            if (!string.IsNullOrEmpty(headerName))
                request.Headers.Remove(headerName);
            request.Headers.Add("Authorization", string.Format(CultureInfo.InvariantCulture, "SharedKey {0}:{1}", new object[] { account.Credentials.AccountName, signedString }));
        }