< Summary - Kestrun — Combined Coverage

Information
Class: Kestrun.Utilities.RateLimiterOptionsExtensions
Assembly: Kestrun
File(s): /home/runner/work/Kestrun/Kestrun/src/CSharp/Kestrun/Utilities/RateLimiterOptionsExtensions.cs
Tag: Kestrun/Kestrun@9d3a582b2d63930269564a7591aa77ef297cadeb
Line coverage
0%
Covered lines: 0
Uncovered lines: 21
Coverable lines: 21
Total lines: 53
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()0%620%
CopyFrom(...)0%2040%

File(s)

/home/runner/work/Kestrun/Kestrun/src/CSharp/Kestrun/Utilities/RateLimiterOptionsExtensions.cs

#LineLine coverage
 1using System.Reflection;
 2using Microsoft.AspNetCore.RateLimiting;
 3namespace Kestrun.Utilities;
 4/// <summary>
 5/// Provides extension methods for copying rate limiter options and policies.
 6/// </summary>
 7public static class RateLimiterOptionsExtensions
 8{
 09    private static readonly MethodInfo AddPolicyMethod =
 010        typeof(RateLimiterOptions)
 011            .GetMethods()
 012            .Single(m => m.Name == "AddPolicy" && m.GetParameters().Length == 2);
 13
 014    private static readonly FieldInfo PolicyMapField =
 015        typeof(RateLimiterOptions).GetField("PolicyMap",
 016            BindingFlags.Instance | BindingFlags.NonPublic)!;
 17
 018    private static readonly FieldInfo UnactivatedPolicyMapField =
 019        typeof(RateLimiterOptions).GetField("UnactivatedPolicyMap",
 020            BindingFlags.Instance | BindingFlags.NonPublic)!;
 21
 22
 23    /// <summary>
 24    /// Copies all rate limiter options and policies from the source to the target <see cref="RateLimiterOptions"/>.
 25    /// </summary>
 26    /// <param name="target">The target <see cref="RateLimiterOptions"/> to copy to.</param>
 27    /// <param name="source">The source <see cref="RateLimiterOptions"/> to copy from.</param>
 28    public static void CopyFrom(this RateLimiterOptions target, RateLimiterOptions source)
 29    {
 030        ArgumentNullException.ThrowIfNull(source);
 31
 32        // ───── scalar props ─────
 033        target.GlobalLimiter = source.GlobalLimiter;
 034        target.OnRejected = source.OnRejected;
 035        target.RejectionStatusCode = source.RejectionStatusCode;
 36
 37        // ───── activated policies ─────
 038        var policyMap = (IDictionary<string, object>)PolicyMapField.GetValue(source)!;
 039        foreach (var kvp in policyMap)
 40        {
 41            // AddPolicy(string, IRateLimiterPolicy<HttpContext>)
 042            _ = AddPolicyMethod.Invoke(target, [kvp.Key, kvp.Value]);
 43        }
 44
 45        // ───── factories awaiting DI (un-activated) ─────
 046        var factoryMap = (IDictionary<string, object>)UnactivatedPolicyMapField.GetValue(source)!;
 047        foreach (var kvp in factoryMap)
 48        {
 49            // AddPolicy(string, Func<IServiceProvider, IRateLimiterPolicy<HttpContext>>)
 050            _ = AddPolicyMethod.Invoke(target, [kvp.Key, kvp.Value]);
 51        }
 052    }
 53}