protected override Task SendAsync()

in Hands-on lab/lab-files/src/Contoso Sports League/Contoso.Apps.PaymentGateway/Throttling/ThrottlingHandler.cs [39:88]


        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var identifier = GetUserIdentifier(request);

            if (string.IsNullOrEmpty(identifier))
            {
                return CreateResponse(request, HttpStatusCode.Forbidden, "Could not identify client.");
            }

            var maxRequests = _maxRequestsForUserIdentifier(identifier);

            ThrottleEntry entry = null;
            if (_store.TryGetValue(identifier, out entry))
            {
                if (entry.PeriodStart + _period < DateTime.UtcNow)
                {
                    _store.Rollover(identifier);
                }
            }
            _store.IncrementRequests(identifier);
            if (!_store.TryGetValue(identifier, out entry))
            {
                return CreateResponse(request, HttpStatusCode.Forbidden, "Could not identify client.");
            }

            Task<HttpResponseMessage> response = null;
            if (entry.Requests > maxRequests)
            {
                response = CreateResponse(request, HttpStatusCode.ServiceUnavailable, _message);
            }
            else
            {
                response = base.SendAsync(request, cancellationToken);
            }

            return response.ContinueWith(task =>
            {
                var remaining = maxRequests - entry.Requests;
                if (remaining < 0)
                {
                    remaining = 0;
                }

                var httpResponse = task.Result;
                httpResponse.Headers.Add("RateLimit-Limit", maxRequests.ToString());
                httpResponse.Headers.Add("RateLimit-Remaining", remaining.ToString());

                return httpResponse;
            });
        }