< Summary - Kestrun — Combined Coverage

Information
Class: Kestrun.Hosting.Compression.KrRequestDecompressionExtensions
Assembly: Kestrun
File(s): /home/runner/work/Kestrun/Kestrun/src/CSharp/Kestrun/Hosting/Compression/KrRequestDecompressionExtensions.cs
Tag: Kestrun/Kestrun@d9261bd752e45afa789d10bc0c82b7d5724d9589
Line coverage
94%
Covered lines: 35
Uncovered lines: 2
Coverable lines: 37
Total lines: 79
Line coverage: 94.5%
Branch coverage
62%
Covered branches: 5
Total branches: 8
Branch coverage: 62.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 02/05/2026 - 00:28:18 Line coverage: 94.5% (35/37) Branch coverage: 62.5% (5/8) Total lines: 79 Tag: Kestrun/Kestrun@d9261bd752e45afa789d10bc0c82b7d5724d9589 02/05/2026 - 00:28:18 Line coverage: 94.5% (35/37) Branch coverage: 62.5% (5/8) Total lines: 79 Tag: Kestrun/Kestrun@d9261bd752e45afa789d10bc0c82b7d5724d9589

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddRequestDecompression(...)50%4487.5%
AddRequestDecompression(...)75%4496.55%

File(s)

/home/runner/work/Kestrun/Kestrun/src/CSharp/Kestrun/Hosting/Compression/KrRequestDecompressionExtensions.cs

#LineLine coverage
 1using Kestrun.Logging;
 2using Microsoft.AspNetCore.RequestDecompression;
 3using Microsoft.Net.Http.Headers;
 4using Serilog.Events;
 5
 6namespace Kestrun.Hosting.Compression;
 7
 8/// <summary>
 9/// Extension methods for request decompression middleware.
 10/// </summary>
 11public static class KrRequestDecompressionExtensions
 12{
 13    /// <summary>
 14    /// Adds request decompression middleware with optional configuration.
 15    /// </summary>
 16    /// <param name="host">The Kestrun host.</param>
 17    /// <param name="configure">Optional configuration delegate.</param>
 18    /// <returns>The configured host.</returns>
 19    public static KestrunHost AddRequestDecompression(this KestrunHost host, Action<RequestDecompressionOptions>? config
 20    {
 221        ArgumentNullException.ThrowIfNull(host);
 22
 223        if (host.Logger.IsEnabled(LogEventLevel.Debug))
 24        {
 025            host.Logger.Debug("Adding request decompression (custom config: {HasConfig})", configure != null);
 26        }
 27
 228        _ = host.AddService(services =>
 229        {
 230            _ = configure == null ? services.AddRequestDecompression() : services.AddRequestDecompression(configure);
 431        });
 32
 433        return host.Use(app => app.UseRequestDecompression());
 34    }
 35
 36    /// <summary>
 37    /// Adds request decompression middleware using allowed encodings.
 38    /// </summary>
 39    /// <param name="host">The Kestrun host.</param>
 40    /// <param name="allowedEncodings">The allowed encodings (gzip, deflate, br).</param>
 41    /// <returns>The configured host.</returns>
 42    public static KestrunHost AddRequestDecompression(this KestrunHost host, IEnumerable<string>? allowedEncodings)
 43    {
 244        if (allowedEncodings == null)
 45        {
 046            return host.AddRequestDecompression();
 47        }
 48
 249        var encodingSet = new HashSet<string>(allowedEncodings, StringComparer.OrdinalIgnoreCase);
 50
 451        _ = host.Use(app => app.Use(async (ctx, next) =>
 452        {
 253            var encHeader = ctx.Request.Headers[HeaderNames.ContentEncoding].ToString();
 254            if (!string.IsNullOrWhiteSpace(encHeader))
 455            {
 256                var encodings = encHeader.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntr
 757                foreach (var encoding in encodings)
 458                {
 259                    if (encoding.Equals("identity", StringComparison.OrdinalIgnoreCase))
 460                    {
 461                        continue;
 462                    }
 463
 264                    if (!encodingSet.Contains(encoding))
 465                    {
 166                        host.Logger.WarningSanitized("Rejected request Content-Encoding: {Encoding}", encoding);
 167                        ctx.Response.StatusCode = StatusCodes.Status415UnsupportedMediaType;
 168                        await ctx.Response.WriteAsync("Unsupported Content-Encoding.", ctx.RequestAborted).ConfigureAwai
 169                        return;
 470                    }
 471                }
 472            }
 473
 174            await next().ConfigureAwait(false);
 675        }));
 76
 277        return host.AddRequestDecompression();
 78    }
 79}