StorageSharedKeyPipelinePolicy
HttpPipelinePolicy to sign requests using an Azure Storage shared key.
using Azure.Core;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
namespace Azure.Storage
{
internal sealed class StorageSharedKeyPipelinePolicy
{
internal class HeaderComparer : IComparer<HttpHeader>
{
private static readonly HeaderStringComparer = new HeaderStringComparer();
public int (HttpHeader x, HttpHeader y)
{
return s_headerComparer.Compare(x.get_Name(), y.get_Name());
}
}
internal class HeaderStringComparer : IComparer<string>
{
private static readonly int[] = new int[128] {
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1820,
0,
1823,
1825,
1827,
1829,
0,
0,
0,
1837,
2051,
0,
0,
1843,
0,
3331,
3354,
3356,
3358,
3360,
3362,
3364,
3366,
3368,
3370,
0,
0,
0,
0,
0,
0,
0,
3586,
3593,
3594,
3610,
3617,
3619,
3621,
3628,
3634,
3637,
3638,
3656,
3665,
3696,
3708,
3710,
3721,
3722,
3729,
3737,
3743,
3746,
3748,
3750,
3751,
3753,
0,
0,
0,
1859,
1860,
1864,
3586,
3593,
3594,
3610,
3617,
3619,
3621,
3628,
3634,
3637,
3638,
3656,
3665,
3696,
3708,
3710,
3721,
3722,
3729,
3737,
3743,
3746,
3748,
3750,
3751,
3753,
0,
1868,
0,
1872,
0
};
private static readonly int[] = new int[128] {
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
18,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
};
private static readonly int[] = new int[128] {
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
32786,
0,
0,
0,
0,
0,
33298,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
};
private static readonly int[][] = new int[3][] {
s_table_lv0,
s_table_lv2,
s_table_lv4
};
public int (string x, string y)
{
int num = 0;
int num2 = 0;
int num3 = 0;
while (num < s_tables.Length) {
if (num == s_tables.Length - 1 && num2 != num3)
return num3 - num2;
int num4 = (num2 >= x.Length) ? 1 : s_tables[num][x[num2]];
int num5 = (num3 >= y.Length) ? 1 : s_tables[num][y[num3]];
if (num4 == 1 && num5 == 1) {
num2 = 0;
num3 = 0;
num++;
} else if (num4 == num5) {
num2++;
num3++;
} else if (num4 == 0) {
num2++;
} else {
if (num5 != 0)
return num4 - num5;
num3++;
}
}
return 0;
}
}
private const bool = true;
private readonly StorageSharedKeyCredential ;
private static readonly HeaderComparer = new HeaderComparer();
public StorageSharedKeyPipelinePolicy(StorageSharedKeyCredential credentials)
: this()
{
_credentials = credentials;
}
public override void (HttpMessage message)
{
this.OnSendingRequest(message);
string text = DateTimeOffset.UtcNow.ToString("r", CultureInfo.InvariantCulture);
RequestHeaders headers = message.get_Request().get_Headers();
headers.SetValue("x-ms-date", text);
string message2 = BuildStringToSign(message);
string str = StorageSharedKeyCredentialInternals.ComputeSasSignature(_credentials, message2);
string text2 = new AuthenticationHeaderValue("SharedKey", _credentials.get_AccountName() + ":" + str).ToString();
headers = message.get_Request().get_Headers();
headers.SetValue("Authorization", text2);
}
private string (HttpMessage message)
{
RequestHeaders headers = message.get_Request().get_Headers();
string text = default(string);
headers.TryGetValue("Content-Encoding", ref text);
headers = message.get_Request().get_Headers();
string text2 = default(string);
headers.TryGetValue("Content-Language", ref text2);
headers = message.get_Request().get_Headers();
string text3 = default(string);
headers.TryGetValue("Content-MD5", ref text3);
headers = message.get_Request().get_Headers();
string text4 = default(string);
headers.TryGetValue("Content-Type", ref text4);
headers = message.get_Request().get_Headers();
string text5 = default(string);
headers.TryGetValue("If-Modified-Since", ref text5);
headers = message.get_Request().get_Headers();
string text6 = default(string);
headers.TryGetValue("If-Match", ref text6);
headers = message.get_Request().get_Headers();
string text7 = default(string);
headers.TryGetValue("If-None-Match", ref text7);
headers = message.get_Request().get_Headers();
string text8 = default(string);
headers.TryGetValue("If-Unmodified-Since", ref text8);
headers = message.get_Request().get_Headers();
string text9 = default(string);
headers.TryGetValue("Range", ref text9);
string text10 = string.Empty;
long num = default(long);
if ((int)message.get_Request().get_Content() != 0 && message.get_Request().get_Content().TryComputeLength(ref num))
text10 = num.ToString(CultureInfo.InvariantCulture);
Uri uri = message.get_Request().get_Uri().ToUri();
StringBuilder stringBuilder = new StringBuilder(uri.AbsolutePath.Length + 64);
StringBuilder stringBuilder2 = stringBuilder;
RequestMethod method = message.get_Request().get_Method();
stringBuilder2.Append(((object)method).ToString().ToUpperInvariant()).Append('\n');
stringBuilder.Append(text ?? "").Append('\n');
stringBuilder.Append(text2 ?? "").Append('\n');
stringBuilder.Append((text10 == "0") ? "" : (text10 ?? "")).Append('\n');
stringBuilder.Append(text3 ?? "");
stringBuilder.Append('\n');
stringBuilder.Append(text4 ?? "").Append('\n');
stringBuilder.Append('\n');
stringBuilder.Append(text5 ?? "").Append('\n');
stringBuilder.Append(text6 ?? "").Append('\n');
stringBuilder.Append(text7 ?? "").Append('\n');
stringBuilder.Append(text8 ?? "").Append('\n');
stringBuilder.Append(text9 ?? "").Append('\n');
BuildCanonicalizedHeaders(stringBuilder, message);
BuildCanonicalizedResource(stringBuilder, uri);
return stringBuilder.ToString();
}
private static void (StringBuilder stringBuilder, HttpMessage message)
{
List<HttpHeader> list = new List<HttpHeader>();
RequestHeaders headers = message.get_Request().get_Headers();
foreach (HttpHeader item in headers) {
HttpHeader current = item;
if (current.get_Name().StartsWith("x-ms-", StringComparison.OrdinalIgnoreCase))
list.Add(new HttpHeader(current.get_Name().ToLowerInvariant(), current.get_Value()));
}
list.Sort(s_headerComparer);
foreach (HttpHeader item2 in list) {
HttpHeader current2 = item2;
stringBuilder.Append(current2.get_Name()).Append(':').Append(current2.get_Value())
.Append('\n');
}
}
private void (StringBuilder stringBuilder, Uri resource)
{
stringBuilder.Append('/');
stringBuilder.Append(_credentials.get_AccountName());
if (resource.AbsolutePath.Length > 0)
stringBuilder.Append(resource.AbsolutePath);
else
stringBuilder.Append('/');
IDictionary<string, string> queryParameters = resource.GetQueryParameters();
if (queryParameters.Count > 0) {
foreach (string item in queryParameters.Keys.OrderBy((string key) => key, StringComparer.Ordinal)) {
stringBuilder.Append('\n').Append(item.ToLowerInvariant()).Append(':')
.Append(queryParameters[item]);
}
}
}
}
}