ExpectContinueOnThrottlePolicy
using Azure.Core;
using System;
using System.Threading;
namespace Azure.Storage
{
    internal class ExpectContinueOnThrottlePolicy
    {
        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)
        {
            long num = default(long);
            if ((int)message.get_Request().get_Content() != 0 && (!message.get_Request().get_Content().TryComputeLength(ref num) || num >= ContentLengthThreshold) && !CompatSwitches.DisableExpectContinueHeader) {
                long num2 = Interlocked.Read(ref _lastThrottleTicks);
                if (DateTimeOffset.UtcNow.Ticks - num2 < _throttleIntervalTicks) {
                    RequestHeaders headers = message.get_Request().get_Headers();
                    headers.SetValue("Expect", "100-continue");
                }
            }
        }
        public override void OnReceivedResponse(HttpMessage message)
        {
            this.OnReceivedResponse(message);
            if (message.get_HasResponse() && (message.get_Response().get_Status() == 429 || message.get_Response().get_Status() == 500 || message.get_Response().get_Status() == 503))
                Interlocked.Exchange(ref _lastThrottleTicks, DateTimeOffset.UtcNow.Ticks);
        }
        public ExpectContinueOnThrottlePolicy()
            : this()
        {
        }
    }
}