/
Frozin
/
DIS-3
Обзор
Документация
Войти
/
Frozin
/
DIS-3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
API_PIR/Middleware/IdempotencyMiddleware.cs
57 строк
2 KB
Dobryk
Исправление опциональных полей
30 окт 2025, 12:58
30 окт 2025, 12:58
4d5f896
Код
Авторство
О чём код?
using API_PIR.Interfaces; namespace API_PIR.Middleware; public class IdempotencyMiddleware { private readonly RequestDelegate _next; public IdempotencyMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context, IIdempotencyService idempotencyService) { if (context.Request.Path.StartsWithSegments("/api/internal")) { await _next(context); return; } if (context.Request.Path.StartsWithSegments("/api/v1")) { await _next(context); return; } if (context.Request.Method == "POST") { if (!context.Request.Headers.TryGetValue("Idempotency-Key", out var keyValues) || string.IsNullOrEmpty(keyValues.FirstOrDefault())) { context.Response.StatusCode = 400; await context.Response.WriteAsync("Idempotency-Key должен быть указан в заголовках"); return; } if (!Guid.TryParse(keyValues.First(), out var idempotencyKey)) { context.Response.StatusCode = 400; await context.Response.WriteAsync("Неверный формат Idempotency-Key"); return; } if (idempotencyService.ContainsKey(idempotencyKey)) { context.Response.StatusCode = 409; await context.Response.WriteAsync("Запрос с таким idempotency key уже существует"); return; } idempotencyService.AddKey(idempotencyKey); context.Items["IdempotencyKey"] = idempotencyKey; } await _next(context); } }