Private/Get-KB4HeaderValue.ps1

function Get-KB4HeaderValue
{
    [CmdletBinding()]
    param(
        [Parameter()]
        [AllowNull()]
        [object] $Headers,

        [Parameter(Mandatory)]
        [string[]] $Name
    )

    if ($null -eq $Headers)
    {
        return $null
    }

    foreach ($headerName in $Name)
    {
        $value = $null

        # Tests use hashtables, while live Invoke-RestMethod returns header objects.
        if ($Headers -is [System.Collections.IDictionary])
        {
            $matchingKey = $Headers.Keys |
                Where-Object `
                {
                    [string] $_ -ieq $headerName
                }
                |
                Select-Object -First 1

            if ($null -ne $matchingKey)
            {
                $value = $Headers[$matchingKey]
            }
        }
        elseif ($Headers.PSObject.Properties['AllKeys'])
        {
            $matchingKey = $Headers.AllKeys |
                Where-Object `
                {
                    [string] $_ -ieq $headerName
                }
                |
                Select-Object -First 1

            if ($null -ne $matchingKey)
            {
                $value = $Headers[$matchingKey]
            }
        }
        else
        {
            # Fall back to object properties or enumerated Key/Value pairs.
            $property = $Headers.PSObject.Properties[$headerName]
            if ($property)
            {
                $value = $property.Value
            }

            if ($null -eq $value)
            {
                foreach ($header in $Headers)
                {
                    if ($header.PSObject.Properties['Key'] -and [string] $header.Key -ieq $headerName)
                    {
                        $value = $header.Value
                        break
                    }
                }
            }
        }

        if ($null -ne $value)
        {
            if ($value -is [array] -or ($value -is [System.Collections.IEnumerable] -and $value -isnot [string]))
            {
                return ($value | Select-Object -First 1)
            }

            return $value
        }
    }

    $null
}