< Summary - Syki

Information
Class: Syki.Back.Configs.RateLimitingConfigs
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Configs/RateLimitingConfigs.cs
Tag: 97_27801654829
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            {
 141218                var userId = context.User?.Id;
 141219                var partitionKey = userId != null
 141220                    ? $"user_{userId}"
 141221                    : $"ip_{context.Connection.RemoteIpAddress}";
 222
 141423                return RateLimitPartition.GetFixedWindowLimiter(partitionKey, _ => new FixedWindowRateLimiterOptions
 141424                {
 141425                    QueueLimit = settings.QueueLimit,
 141426                    PermitLimit = settings.GlobalPermitLimit,
 141427                    Window = TimeSpan.FromSeconds(settings.GlobalWindowInSeconds),
 141428                });
 229            });
 230
 231            options.AddPolicy(SensitivePolicy, context =>
 232            {
 75433                var partitionKey = $"ip_{context.Connection.RemoteIpAddress}";
 234
 75635                return RateLimitPartition.GetFixedWindowLimiter(partitionKey, _ => new FixedWindowRateLimiterOptions
 75636                {
 75637                    QueueLimit = settings.QueueLimit,
 75638                    PermitLimit = settings.SensitivePermitLimit,
 75639                    Window = TimeSpan.FromSeconds(settings.SensitiveWindowInSeconds),
 75640                });
 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}