/
Lexus_666
/
Pir_API
Обзор
Документация
Войти
/
Lexus_666
/
Pir_API
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Middleware/RateLimitingMiddleware.cs
54 строки
2 KB
Lexus_666
Lab 2 done
20 окт 2025, 05:24
20 окт 2025, 05:24
1680046
Код
Авторство
О чём код?
namespace Pir_API.Middleware; public class RateLimitingMiddleware { private readonly RequestDelegate _next; private readonly Dictionary<string, (int Count, DateTime WindowStart)> _requestCounts = new(); private const int Limit = 16; private readonly TimeSpan _window = TimeSpan.FromMinutes(1); public RateLimitingMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { if (context.Request.Path.StartsWithSegments("/api/internal")) { await _next(context); return; } var clientId = context.Connection.RemoteIpAddress?.ToString() ?? "unknown"; var now = DateTime.UtcNow; if (!_requestCounts.TryGetValue(clientId, out var clientData)) { clientData = (0, now); } if (now - clientData.WindowStart > _window) { clientData = (0, now); } if (clientData.Count >= Limit) { context.Response.StatusCode = StatusCodes.Status429TooManyRequests; var retryAfter = (int)(clientData.WindowStart.Add(_window) - now).TotalSeconds; context.Response.Headers.RetryAfter = retryAfter.ToString(); await context.Response.WriteAsync("Too many requests"); return; } clientData.Count++; _requestCounts[clientId] = clientData; context.Response.Headers["X-RateLimit-Limit"] = Limit.ToString(); context.Response.Headers["X-RateLimit-Remaining"] = (Limit - clientData.Count).ToString(); context.Response.Headers["X-RateLimit-Reset"] = clientData.WindowStart.Add(_window).ToString("R"); await _next(context); } }