/
aprogrammer
/
dotnet-docs
Обзор
Документация
Войти
/
aprogrammer
/
dotnet-docs
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
docs/core/extensions/snippets/ratelimit/http/ClientSideRateLimitedHandler.cs
46 строк
1 KB
David Pine
Upgrade TFMs to .NET 8.0, and packages (#38752)
15 дек 2023, 16:49
Не верифицирован
15 дек 2023, 16:49
114b8f9
Код
Авторство
О чём код?
internal sealed class ClientSideRateLimitedHandler( RateLimiter limiter) : DelegatingHandler(new HttpClientHandler()), IAsyncDisposable { protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { using RateLimitLease lease = await limiter.AcquireAsync( permitCount: 1, cancellationToken); if (lease.IsAcquired) { return await base.SendAsync(request, cancellationToken); } var response = new HttpResponseMessage(HttpStatusCode.TooManyRequests); if (lease.TryGetMetadata( MetadataName.RetryAfter, out TimeSpan retryAfter)) { response.Headers.Add( "Retry-After", ((int)retryAfter.TotalSeconds).ToString( NumberFormatInfo.InvariantInfo)); } return response; } async ValueTask IAsyncDisposable.DisposeAsync() { await limiter.DisposeAsync().ConfigureAwait(false); Dispose(disposing: false); GC.SuppressFinalize(this); } protected override void Dispose(bool disposing) { base.Dispose(disposing); if (disposing) { limiter.Dispose(); } } }