/// <summary> /// Appends the values of the x-ms-* headers to the specified canonicalized string. /// </summary> /// <param name="canonicalizedString">The canonicalized string where the values are appended.</param> /// <param name="request">The request where the values are read from.</param> public static void AppendCanonicalizedCustomHeaders(CanonicalizedString canonicalizedString, HttpRequestMessage request) { CultureInfo sortingCulture = new CultureInfo("en-US"); #if WINDOWS_DESKTOP StringComparer sortingComparer = StringComparer.Create(sortingCulture, false); #else StringComparer sortingComparer = new CultureStringComparer(sortingCulture, false); #endif SortedDictionary <string, IEnumerable <string> > headers = new SortedDictionary <string, IEnumerable <string> >(sortingComparer); foreach (KeyValuePair <string, IEnumerable <string> > header in request.Headers) { string headerName = header.Key; if (headerName.StartsWith(Constants.HeaderConstants.PrefixForStorageHeader, StringComparison.OrdinalIgnoreCase)) { headers.Add(headerName.ToLowerInvariant(), header.Value); } } if (request.Content != null) { foreach (KeyValuePair <string, IEnumerable <string> > header in request.Content.Headers) { string headerName = header.Key; if (headerName.StartsWith(Constants.HeaderConstants.PrefixForStorageHeader, StringComparison.OrdinalIgnoreCase)) { headers.Add(headerName.ToLowerInvariant(), header.Value); } } } StringBuilder canonicalizedElement = new StringBuilder(ExpectedHeaderNameAndValueLength); foreach (KeyValuePair <string, IEnumerable <string> > header in headers) { canonicalizedElement.Clear(); canonicalizedElement.Append(header.Key); canonicalizedElement.Append(HeaderNameValueSeparator); int keyLength = canonicalizedElement.Length; foreach (string value in header.Value) { canonicalizedElement.Append(value.TrimStart().Replace("\r\n", string.Empty)); canonicalizedElement.Append(HeaderValueDelimiter); } canonicalizedString.AppendCanonicalizedElement(canonicalizedElement.ToString(0, canonicalizedElement.Length - 1)); } }
/// <summary> /// Add x-ms- prefixed headers in a fixed order. /// </summary> /// <param name="headers">The headers.</param> /// <param name="canonicalizedString">The canonicalized string.</param> internal static void AddCanonicalizedHeaders(HttpRequestMessage request, CanonicalizedString canonicalizedString) { CultureInfo sortingCulture = new CultureInfo("en-US"); StringComparer sortingComparer = new CultureStringComparer(sortingCulture, false); // Look for header names that start with x-ms-, then sort them in case-insensitive manner. SortedDictionary<string, IEnumerable<string>> httpStorageHeaders = new SortedDictionary<string, IEnumerable<string>>(sortingComparer); foreach (KeyValuePair<string, IEnumerable<string>> header in request.Headers) { if (header.Key.StartsWith(Constants.HeaderConstants.PrefixForStorageHeader, StringComparison.OrdinalIgnoreCase)) { httpStorageHeaders.Add(header.Key.ToLowerInvariant(), header.Value); } } if (request.Content != null) { foreach (KeyValuePair<string, IEnumerable<string>> header in request.Content.Headers) { if (header.Key.StartsWith(Constants.HeaderConstants.PrefixForStorageHeader, StringComparison.OrdinalIgnoreCase)) { httpStorageHeaders.Add(header.Key.ToLowerInvariant(), header.Value); } } } // Now go through each header's values in the sorted order and append them to the canonicalized string. foreach (KeyValuePair<string, IEnumerable<string>> header in httpStorageHeaders) { StringBuilder canonicalizedElement = new StringBuilder(header.Key); string delimiter = ":"; // Go through values, unfold them, and then append them to the canonicalized element string. foreach (string value in header.Value) { // Unfolding is simply removal of CRLF. string unfoldedValue = value.TrimStart().Replace("\r\n", string.Empty); // Append it to the canonicalized element string. canonicalizedElement.Append(delimiter); canonicalizedElement.Append(unfoldedValue); delimiter = ","; } // Now, add this canonicalized element to the canonicalized header string. canonicalizedString.AppendCanonicalizedElement(canonicalizedElement.ToString()); } }
/// <summary> /// Appends the values of the x-ms-* headers to the specified canonicalized string. /// </summary> /// <param name="canonicalizedString">The canonicalized string where the values are appended.</param> /// <param name="request">The request where the values are read from.</param> public static void AppendCanonicalizedCustomHeaders(CanonicalizedString canonicalizedString, HttpRequestMessage request) { CultureInfo sortingCulture = new CultureInfo("en-US"); StringComparer sortingComparer = new CultureStringComparer(sortingCulture, false); SortedDictionary<string, IEnumerable<string>> headers = new SortedDictionary<string, IEnumerable<string>>(sortingComparer); foreach (KeyValuePair<string, IEnumerable<string>> header in request.Headers) { string headerName = header.Key; if (headerName.StartsWith(Constants.HeaderConstants.PrefixForStorageHeader, StringComparison.OrdinalIgnoreCase)) { headers.Add(headerName.ToLowerInvariant(), header.Value); } } if (request.Content != null) { foreach (KeyValuePair<string, IEnumerable<string>> header in request.Content.Headers) { string headerName = header.Key; if (headerName.StartsWith(Constants.HeaderConstants.PrefixForStorageHeader, StringComparison.OrdinalIgnoreCase)) { headers.Add(headerName.ToLowerInvariant(), header.Value); } } } StringBuilder canonicalizedElement = new StringBuilder(ExpectedHeaderNameAndValueLength); foreach (KeyValuePair<string, IEnumerable<string>> header in headers) { canonicalizedElement.Clear(); canonicalizedElement.Append(header.Key); canonicalizedElement.Append(HeaderNameValueSeparator); foreach (string value in header.Value) { canonicalizedElement.Append(value.TrimStart().Replace("\r\n", string.Empty)); canonicalizedElement.Append(HeaderValueDelimiter); } canonicalizedString.AppendCanonicalizedElement(canonicalizedElement.ToString(0, canonicalizedElement.Length - 1)); } }