/
Frozin
/
DIS-3
Обзор
Документация
Войти
/
Frozin
/
DIS-3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
API_PIR/Middleware/RateLimitingMiddleware.cs
54 строки
2 KB
Dobryk
Добавлен внутренний API
20 окт 2025, 05:26
20 окт 2025, 05:26
7ee684c
Код
Авторство
О чём код?
namespace API_PIR.Middleware; public class RateLimitingMiddleware { private readonly RequestDelegate _next; private readonly Dictionary<string, (int Count, DateTime WindowStart)> _requestCounts = new(); private const int Limit = 10; 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("Слишком много запросов"); 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); } }