/
Lexus_666
/
PIR_Lab_3
Обзор
Документация
Войти
/
Lexus_666
/
PIR_Lab_3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
PIR_Lab_1/Middleware/RateLimitingMiddleware.cs
59 строк
2 KB
Lexus_666
CORS setup
24 дек 2025, 00:32
24 дек 2025, 00:32
81bee9f
Код
Авторство
О чём код?
namespace PIR_Lab_1.Middleware; public class RateLimitingMiddleware { private readonly RequestDelegate _next; private readonly Dictionary<string, (int Count, DateTime WindowStart)> _requestCounts = new(); private const int Limit = 15; 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 = GetClientId(context); 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("Rate limit exceeded"); 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); } private static string GetClientId(HttpContext context) { return context.Connection.RemoteIpAddress?.ToString() ?? "unknown"; } }