ExpectContinueOnThrottlePolicy
using Azure.Core;
using Azure.Core.Pipeline;
using System;
using System.Threading;
namespace Azure.Storage
{
    internal class ExpectContinueOnThrottlePolicy : HttpPipelineSynchronousPolicy
    {
        private long _lastThrottleTicks;
        private long _throttleIntervalTicks = 600000000;
        public TimeSpan ThrottleInterval {
            get {
                return TimeSpan.FromTicks(_throttleIntervalTicks);
            }
            set {
                _throttleIntervalTicks = value.Ticks;
            }
        }
        public long ContentLengthThreshold { get; set; }
        public override void OnSendingRequest(HttpMessage message)
        {
            if (message.Request.Content != null && (!message.Request.Content.TryComputeLength(out long length) || length >= ContentLengthThreshold) && !CompatSwitches.DisableExpectContinueHeader) {
                long num = Interlocked.Read(ref _lastThrottleTicks);
                if (DateTimeOffset.UtcNow.Ticks - num < _throttleIntervalTicks)
                    message.Request.Headers.SetValue("Expect", "100-continue");
            }
        }
        public override void OnReceivedResponse(HttpMessage message)
        {
            base.OnReceivedResponse(message);
            if (message.HasResponse && (message.Response.Status == 429 || message.Response.Status == 500 || message.Response.Status == 503))
                Interlocked.Exchange(ref _lastThrottleTicks, DateTimeOffset.UtcNow.Ticks);
        }
    }
}