internal static Uri CreateRequestUri( Uri baseUri, bool usePathStyleUris, string accountName, string containerName, string blobName, TimeSpan Timeout, NameValueCollection queryParameters, out ResourceUriComponents uriComponents ) { uriComponents = new ResourceUriComponents(accountName, containerName, blobName); Uri uri = HttpRequestAccessor.ConstructResourceUri(baseUri, uriComponents, usePathStyleUris); if (queryParameters != null) { UriBuilder builder = new UriBuilder(uri); if (queryParameters.Get(StorageHttpConstants.QueryParams.QueryParamTimeout) == null) { queryParameters.Add(StorageHttpConstants.QueryParams.QueryParamTimeout, Timeout.TotalSeconds.ToString(CultureInfo.InvariantCulture)); } StringBuilder sb = new StringBuilder(); bool firstParam = true; foreach (string queryKey in queryParameters.AllKeys) { if (!firstParam) { sb.Append("&"); } sb.Append(HttpUtility.UrlEncode(queryKey)); sb.Append('='); sb.Append(HttpUtility.UrlEncode(queryParameters[queryKey])); firstParam = false; } if (sb.Length > 0) { builder.Query = sb.ToString(); } return(builder.Uri); } else { return(uri); } }
internal QueueRest( string name, StorageAccountInfo account, TimeSpan timeout, RetryPolicy retryPolicy ) : base(name, account) { byte[] key = null; if (AccountInfo.Base64Key != null) { key = Convert.FromBase64String(AccountInfo.Base64Key); } ResourceUriComponents uriComponents = new ResourceUriComponents(account.AccountName, name, null); _credentials = new SharedKeyCredentials(AccountInfo.AccountName, key); _queueUri = HttpRequestAccessor.ConstructResourceUri(account.BaseUri, uriComponents, account.UsePathStyleUris); Timeout = timeout; RetryPolicy = retryPolicy; }
internal static string CanonicalizeHttpRequest( Uri address, ResourceUriComponents uriComponents, string method, string contentType, string date, NameValueCollection headers) { // The first element should be the Method of the request. // I.e. GET, POST, PUT, or HEAD. CanonicalizedString canonicalizedString = new CanonicalizedString(method); // The second element should be the MD5 value. // This is optional and may be empty. string httpContentMD5Value = string.Empty; // First extract all the content MD5 values from the header. ArrayList httpContentMD5Values = HttpRequestAccessor.GetHeaderValues(headers, StorageHttpConstants.HeaderNames.ContentMD5); // If we only have one, then set it to the value we want to append to the canonicalized string. if (httpContentMD5Values.Count == 1) { httpContentMD5Value = (string)httpContentMD5Values[0]; } canonicalizedString.AppendCanonicalizedElement(httpContentMD5Value); // The third element should be the content type. canonicalizedString.AppendCanonicalizedElement(contentType); // The fourth element should be the request date. // See if there's an storage date header. // If there's one, then don't use the date header. ArrayList httpStorageDateValues = HttpRequestAccessor.GetHeaderValues(headers, StorageHttpConstants.HeaderNames.StorageDateTime); if (httpStorageDateValues.Count > 0) { date = null; } canonicalizedString.AppendCanonicalizedElement(date); // Look for header names that start with StorageHttpConstants.HeaderNames.PrefixForStorageHeader // Then sort them in case-insensitive manner. ArrayList httpStorageHeaderNameArray = new ArrayList(); foreach (string key in headers.Keys) { if (key.ToLowerInvariant().StartsWith(StorageHttpConstants.HeaderNames.PrefixForStorageHeader, StringComparison.Ordinal)) { httpStorageHeaderNameArray.Add(key.ToLowerInvariant()); } } httpStorageHeaderNameArray.Sort(); // Now go through each header's values in the sorted order and append them to the canonicalized string. foreach (string key in httpStorageHeaderNameArray) { StringBuilder canonicalizedElement = new StringBuilder(key); string delimiter = ":"; ArrayList values = HttpRequestAccessor.GetHeaderValues(headers, key); // Go through values, unfold them, and then append them to the canonicalized element string. foreach (string value in values) { // Unfolding is simply removal of CRLF. string unfoldedValue = value.Replace(StorageHttpConstants.ConstChars.CarriageReturnLinefeed, 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()); } // Now we append the canonicalized resource element. string canonicalizedResource = GetCanonicalizedResource(address, uriComponents); canonicalizedString.AppendCanonicalizedElement(canonicalizedResource); return(canonicalizedString.Value); }