< Summary - Syki

Information
Class: Syki.Back.Configs.RateLimitingConfigs
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Configs/RateLimitingConfigs.cs
Tag: 56_26538939494
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 Syki.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            {
 108818                var userId = context.User?.Id;
 108819                var partitionKey = userId != null
 108820                    ? $"user_{userId}"
 108821                    : $"ip_{context.Connection.RemoteIpAddress}";
 222
 109023                return RateLimitPartition.GetFixedWindowLimiter(partitionKey, _ => new FixedWindowRateLimiterOptions
 109024                {
 109025                    QueueLimit = settings.QueueLimit,
 109026                    PermitLimit = settings.GlobalPermitLimit,
 109027                    Window = TimeSpan.FromSeconds(settings.GlobalWindowInSeconds),
 109028                });
 229            });
 230
 231            options.AddPolicy(SensitivePolicy, context =>
 232            {
 70033                var partitionKey = $"ip_{context.Connection.RemoteIpAddress}";
 234
 70235                return RateLimitPartition.GetFixedWindowLimiter(partitionKey, _ => new FixedWindowRateLimiterOptions
 70236                {
 70237                    QueueLimit = settings.QueueLimit,
 70238                    PermitLimit = settings.SensitivePermitLimit,
 70239                    Window = TimeSpan.FromSeconds(settings.SensitiveWindowInSeconds),
 70240                });
 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}