< Summary - Estud

Information
Class: Estud.Back.Configs.RateLimitingConfigs
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Configs/RateLimitingConfigs.cs
Tag: 114_29044117136
Line coverage
89%
Covered lines: 41
Uncovered lines: 5
Coverable lines: 46
Total lines: 62
Line coverage: 89.1%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddRateLimitingConfigs(...)83.33%121288.63%
UseRateLimiting(...)100%11100%

File(s)

/home/runner/work/syki/syki/Back/Configs/RateLimitingConfigs.cs

#LineLine coverage
 1using System.Text.Json;
 2using System.Threading.RateLimiting;
 3
 4namespace Estud.Back.Configs;
 5
 6public static class RateLimitingConfigs
 7{
 8    public const string SensitivePolicy = nameof(SensitivePolicy);
 9
 10    public static void AddRateLimitingConfigs(this WebApplicationBuilder builder)
 11    {
 212        var settings = builder.Configuration.RateLimiting;
 13
 214        builder.Services.AddRateLimiter(options =>
 215        {
 216            options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(context =>
 217            {
 354818                var userId = context.User?.Id;
 354819                var partitionKey = userId != null
 354820                    ? $"user_{userId}"
 354821                    : $"ip_{context.Connection.RemoteIpAddress}";
 222
 355023                return RateLimitPartition.GetFixedWindowLimiter(partitionKey, _ => new FixedWindowRateLimiterOptions
 355024                {
 355025                    QueueLimit = settings.QueueLimit,
 355026                    PermitLimit = settings.GlobalPermitLimit,
 355027                    Window = TimeSpan.FromSeconds(settings.GlobalWindowInSeconds),
 355028                });
 229            });
 230
 231            options.AddPolicy(SensitivePolicy, context =>
 232            {
 178833                var partitionKey = $"ip_{context.Connection.RemoteIpAddress}";
 234
 179035                return RateLimitPartition.GetFixedWindowLimiter(partitionKey, _ => new FixedWindowRateLimiterOptions
 179036                {
 179037                    QueueLimit = settings.QueueLimit,
 179038                    PermitLimit = settings.SensitivePermitLimit,
 179039                    Window = TimeSpan.FromSeconds(settings.SensitiveWindowInSeconds),
 179040                });
 241            });
 242
 243            options.OnRejected = async (context, cancellationToken) =>
 244            {
 045                context.HttpContext.Response.ContentType = "application/json";
 046                context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests;
 247
 048                if (context.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter))
 249                {
 050                    context.HttpContext.Response.Headers.RetryAfter = ((int)retryAfter.TotalSeconds).ToString();
 251                }
 252
 053                await context.HttpContext.Response.WriteAsync(JsonSerializer.Serialize(TooManyRequests.I), cancellationT
 254            };
 455        });
 256    }
 57
 58    public static void UseRateLimiting(this IApplicationBuilder app)
 59    {
 260        app.UseRateLimiter();
 261    }
 62}