StorageTelemetryPolicy
using Azure.Core;
using Azure.Core.Pipeline;
using System;
namespace Azure.Storage
{
internal class StorageTelemetryPolicy : HttpPipelineSynchronousPolicy
{
[Flags]
private enum AzFeatures
{
None = 0,
CseV1 = 1,
CseV2 = 2
}
private const string CseIdentifierV2 = "azstorage-clientsideencryption/2.0";
private const string CseIdentifierV1 = "azstorage-clientsideencryption/1.0";
public static StorageTelemetryPolicy { get; } = new StorageTelemetryPolicy();
private StorageTelemetryPolicy()
{
}
public override void OnSendingRequest(HttpMessage message)
{
AzFeatures azFeatures = AzFeatures.None;
if (message.TryGetProperty("Azure.Storage.StorageTelemetryPolicy.ClientSideEncryption.V2", out object value))
azFeatures |= AzFeatures.CseV2;
else if (message.TryGetProperty("Azure.Storage.StorageTelemetryPolicy.ClientSideEncryption.V1", out value)) {
azFeatures |= AzFeatures.CseV1;
}
if (azFeatures != 0)
ApplyAzFeatures(message, azFeatures);
}
private static void ApplyAzFeatures(HttpMessage message, AzFeatures azFeatures)
{
string text = Serialize(azFeatures);
RequestHeaders headers = message.Request.Headers;
if (headers.TryGetValue(HttpHeader.Names.UserAgent, out string value) && !value.Contains(text)) {
headers = message.Request.Headers;
headers.SetValue(HttpHeader.Names.UserAgent, TransformUserAgent(value, text));
} else {
headers = message.Request.Headers;
headers.SetValue(HttpHeader.Names.UserAgent, text);
}
}
private static string Serialize(AzFeatures azFeatures)
{
if ((azFeatures & AzFeatures.CseV2) == AzFeatures.CseV2)
return "azstorage-clientsideencryption/2.0";
if ((azFeatures & AzFeatures.CseV1) == AzFeatures.CseV1)
return "azstorage-clientsideencryption/1.0";
return "";
}
private static string TransformUserAgent(string userAgent, string injection)
{
if (string.IsNullOrEmpty(injection))
return userAgent;
return string.Join(" ", injection, userAgent);
}
}
}