< Summary - Kestrun — Combined Coverage

Information
Class: Public.Middleware.Add-KrForwardHeader
Assembly: Kestrun.PowerShell.Public
File(s): /home/runner/work/Kestrun/Kestrun/src/PowerShell/Kestrun/Public/Middleware/Add-KrForwardHeader.ps1
Tag: Kestrun/Kestrun@6135d944f8787fb570e4dfbacac6e80312799a86
Line coverage
0%
Covered lines: 0
Uncovered lines: 43
Coverable lines: 43
Total lines: 197
Line coverage: 0%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 12/01/2025 - 20:55:19 Line coverage: 0% (0/44) Total lines: 203 Tag: Kestrun/Kestrun@638a27c2dd54103f693f023b6ba5f56a884caafa05/09/2026 - 21:51:36 Line coverage: 0% (0/43) Total lines: 197 Tag: Kestrun/Kestrun@6b24c7512a1bad61723a28d32446de0aa658293e

Coverage delta

Coverage delta 1 -1

Metrics

File(s)

/home/runner/work/Kestrun/Kestrun/src/PowerShell/Kestrun/Public/Middleware/Add-KrForwardHeader.ps1

#LineLine coverage
 1<#
 2.SYNOPSIS
 3    Adds Forwarded Headers middleware to a Kestrun server.
 4.DESCRIPTION
 5    This cmdlet adds and configures the ASP.NET Core Forwarded Headers middleware
 6    for a Kestrun server. This middleware processes proxy-related headers such as
 7    X-Forwarded-For, X-Forwarded-Proto, X-Forwarded-Host, and X-Forwarded-Prefix to
 8    update the request's Scheme, Host, and Remote IP address accordingly.
 9    This is essential when hosting behind reverse proxies or load balancers that
 10    modify these headers.
 11.PARAMETER Options
 12    An instance of Microsoft.AspNetCore.Builder.ForwardedHeadersOptions to configure
 13    the middleware. This allows for full customization of the middleware behavior.
 14.PARAMETER XForwardedFor
 15    Switch to enable processing of the X-Forwarded-For header.
 16.PARAMETER XForwardedProto
 17    Switch to enable processing of the X-Forwarded-Proto header.
 18.PARAMETER XForwardedHost
 19    Switch to enable processing of the X-Forwarded-Host header.
 20.PARAMETER XForwardedPrefix
 21    Switch to enable processing of the X-Forwarded-Prefix header.
 22.PARAMETER All
 23    Switch to enable processing of all supported forwarded headers.
 24.PARAMETER ForwardLimit
 25    Specifies the maximum number of entries to read from the forwarded headers.
 26    Default is 1.
 27.PARAMETER KnownNetworks
 28    An array of IPNetwork objects representing known networks from which forwarded
 29    headers will be accepted.
 30.PARAMETER KnownProxies
 31    An array of IPAddress objects representing known proxy servers from which
 32    forwarded headers will be accepted.
 33.PARAMETER ForwardedForHeaderName
 34    Custom header name for X-Forwarded-For.
 35.PARAMETER ForwardedProtoHeaderName
 36    Custom header name for X-Forwarded-Proto.
 37.PARAMETER ForwardedHostHeaderName
 38    Custom header name for X-Forwarded-Host.
 39.PARAMETER ForwardedPrefixHeaderName
 40    Custom header name for X-Forwarded-Prefix.
 41.PARAMETER OriginalForHeaderName
 42    Custom header name for Original-For.
 43.PARAMETER OriginalProtoHeaderName
 44    Custom header name for Original-Proto.
 45.PARAMETER OriginalHostHeaderName
 46    Custom header name for Original-Host.
 47.PARAMETER OriginalPrefixHeaderName
 48    Custom header name for Original-Prefix.
 49.PARAMETER RequireHeaderSymmetry
 50    Switch to require that all enabled forwarded headers are present in the request.
 51.EXAMPLE
 52    Add-KrForwardedHeader -XForwardedFor -XForwardedProto -KnownProxies $proxyIps
 53    Adds Forwarded Headers middleware to the current Kestrun server, enabling
 54    processing of X-Forwarded-For and X-Forwarded-Proto headers, and
 55    trusting the specified proxy IP addresses.
 56.NOTES
 57    This cmdlet is part of the Kestrun PowerShell module.
 58#>
 59function Add-KrForwardedHeader {
 60    [KestrunRuntimeApi('Definition')]
 61    [CmdletBinding(DefaultParameterSetName = 'Items')]
 62    param(
 63        # --- ParameterSet: Options (verbatim pass-through) ---
 64        [Parameter(Mandatory = $true, ParameterSetName = 'Options')]
 65        [Microsoft.AspNetCore.Builder.ForwardedHeadersOptions]$Options,
 66
 67        # --- ParameterSet: Items (switches compose the enum) ---
 68        [Parameter(ParameterSetName = 'Items')]
 69        [switch]$XForwardedFor,
 70
 71        [Parameter(ParameterSetName = 'Items')]
 72        [switch]$XForwardedProto,
 73
 74        [Parameter(ParameterSetName = 'Items')]
 75        [switch]$XForwardedHost,
 76
 77        [Parameter(ParameterSetName = 'Items')]
 78        [switch]$XForwardedPrefix,
 79
 80        [Parameter(ParameterSetName = 'Items')]
 81        [switch]$All,  # convenience
 82
 83        [Parameter(ParameterSetName = 'Items')]
 84        [int]$ForwardLimit = 1,
 85
 86        [Parameter(ParameterSetName = 'Items')]
 87        [string[]]$KnownNetworks,
 88
 89        [Parameter(ParameterSetName = 'Items')]
 90        [string[]]$KnownProxies,
 91
 92        # Optional header name overrides (default to ForwardedHeadersDefaults)
 93        [Parameter(ParameterSetName = 'Items')]
 94        [string]$ForwardedForHeaderName,
 95
 96        [Parameter(ParameterSetName = 'Items')]
 97        [string]$ForwardedProtoHeaderName,
 98
 99        [Parameter(ParameterSetName = 'Items')]
 100        [string]$ForwardedHostHeaderName,
 101
 102        [Parameter(ParameterSetName = 'Items')]
 103        [string]$ForwardedPrefixHeaderName,
 104
 105        [Parameter(ParameterSetName = 'Items')]
 106        [string]$OriginalForHeaderName,
 107
 108        [Parameter(ParameterSetName = 'Items')]
 109        [string]$OriginalProtoHeaderName,
 110
 111        [Parameter(ParameterSetName = 'Items')]
 112        [string]$OriginalHostHeaderName,
 113
 114        [Parameter(ParameterSetName = 'Items')]
 115        [string]$OriginalPrefixHeaderName,
 116
 117        [Parameter(ParameterSetName = 'Items')]
 118        [switch]$RequireHeaderSymmetry
 119    )
 0120    $Server = Resolve-KestrunServer
 121
 0122    if ($PSCmdlet.ParameterSetName -eq 'Items') {
 123        # Compose ForwardedHeadersOptions from switches
 0124        $fhEnum = [Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders]
 125
 126        # Create options
 0127        $Options = [Microsoft.AspNetCore.Builder.ForwardedHeadersOptions]::new()
 128        # Compose flags from switches
 0129        if ($All) {
 0130            $Options.ForwardedHeaders = [Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders]::All
 131        } else {
 0132            $flags = $fhEnum::None
 0133            if ($XForwardedFor) { $flags = $flags -bor $fhEnum::XForwardedFor }
 0134            if ($XForwardedProto) { $flags = $flags -bor $fhEnum::XForwardedProto }
 0135            if ($XForwardedHost) { $flags = $flags -bor $fhEnum::XForwardedHost }
 0136            if ($XForwardedPrefix) { $flags = $flags -bor $fhEnum::XForwardedPrefix }
 0137            if ($flags -eq $fhEnum::None) {
 138                # Sensible default if user didn’t specify: For + Proto
 0139                $flags = $fhEnum::XForwardedFor -bor $fhEnum::XForwardedProto
 140            }
 0141            $Options.ForwardedHeaders = $flags
 142        }
 143
 144        # Forward limit
 0145        $Options.ForwardLimit = $ForwardLimit
 146
 147        # Known proxies
 0148        if ($PSBoundParameters.ContainsKey('KnownProxies')) {
 0149            $Options.KnownProxies.Clear()
 0150            foreach ($p in $KnownProxies) {
 0151                $ip = if ($p -is [System.Net.IPAddress]) { $p } else { [System.Net.IPAddress]::Parse($p) }
 0152                [void]$Options.KnownProxies.Add($ip)
 153            }
 154        }
 155        # Known networks
 0156        if ($PSBoundParameters.ContainsKey('KnownNetworks')) {
 0157            $Options.KnownNetworks.Clear()
 0158            foreach ($n in $KnownNetworks) {
 159                # Allow "10.0.0.0/24" or IPNetwork objects directly
 0160                $net = if ($n -is [System.Net.IPNetwork]) { $n } else { [System.Net.IPNetwork]::Parse($n) }
 0161                [void]$Options.KnownNetworks.Add($net)
 162            }
 163        }
 164        # Custom header names
 0165        if ($PSBoundParameters.ContainsKey('ForwardedForHeaderName')) {
 0166            $Options.ForwardedForHeaderName = $ForwardedForHeaderName
 167        }
 0168        if ($PSBoundParameters.ContainsKey('ForwardedProtoHeaderName')) {
 0169            $Options.ForwardedProtoHeaderName = $ForwardedProtoHeaderName
 170        }
 0171        if ($PSBoundParameters.ContainsKey('ForwardedHostHeaderName')) {
 0172            $Options.ForwardedHostHeaderName = $ForwardedHostHeaderName
 173        }
 0174        if ($PSBoundParameters.ContainsKey('ForwardedPrefixHeaderName')) {
 0175            $Options.ForwardedPrefixHeaderName = $ForwardedPrefixHeaderName
 176        }
 0177        if ($PSBoundParameters.ContainsKey('OriginalForHeaderName')) {
 0178            $Options.OriginalForHeaderName = $OriginalForHeaderName
 179        }
 0180        if ($PSBoundParameters.ContainsKey('OriginalProtoHeaderName')) {
 0181            $Options.OriginalProtoHeaderName = $OriginalProtoHeaderName
 182        }
 0183        if ($PSBoundParameters.ContainsKey('OriginalHostHeaderName')) {
 0184            $Options.OriginalHostHeaderName = $OriginalHostHeaderName
 185        }
 0186        if ($PSBoundParameters.ContainsKey('OriginalPrefixHeaderName')) {
 0187            $Options.OriginalPrefixHeaderName = $OriginalPrefixHeaderName
 188        }
 189
 190        # Symmetry
 0191        $Options.RequireHeaderSymmetry = $RequireHeaderSymmetry.IsPresent
 192    }
 193
 194    # Attach to server so host.Apply() can call app.UseForwardedHeaders($Options)
 0195    $Server.ForwardedHeaderOptions = $Options
 196}
 197

Methods/Properties

Add-KrForwardedHeader()