internal/functions/Get-XdrIdentityHeaders.ps1

function Get-XdrIdentityHeaders {
    <#
    .SYNOPSIS
        Builds request headers for MDI identity API calls.

    .DESCRIPTION
        Clones the current XDR session headers and appends the additional headers
        required by MDI identity APIs. Tenant headers are added from cache when
        available.

    .PARAMETER Package
        Header value for m-package.

    .PARAMETER Type
        Header value for m-type.

    .PARAMETER Name
        Header value for m-name.

    .PARAMETER ComponentName
        Header value for m-componentName.

    .PARAMETER ClientPage
        Header value for x-clientpage.

    .PARAMETER AcceptLanguage
        Header value for accept-language.

    .PARAMETER IncludeTenantId
        If true, adds tenant-id (and x-tid when missing) from cached tenant context.

    .EXAMPLE
        Get-XdrIdentityHeaders

        Returns default MDI identity headers merged with current XDR session headers.

    .EXAMPLE
        Get-XdrIdentityHeaders -Package 'identities' -Name 'TimelinePage' -ClientPage 'timeline@msec-identities'

        Returns headers customized for an identity timeline request.

    .OUTPUTS
        Hashtable
    #>

    [OutputType([System.Collections.Hashtable])]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseSingularNouns', '', Justification = 'Headers is a collection of HTTP header values.')]
    [CmdletBinding()]
    param(
        [Parameter()]
        [string]$Package = 'identities',

        [Parameter()]
        [string]$Type = 'Page',

        [Parameter()]
        [string]$Name = 'UserPageRouteResolver[identities]',

        [Parameter()]
        [string]$ComponentName = 'UserPageRouteResolver',

        [Parameter()]
        [string]$ClientPage = 'user@msec-identities',

        [Parameter()]
        [string]$AcceptLanguage = 'en-us',

        [Parameter()]
        [bool]$IncludeTenantId = $true
    )

    process {
        if (-not (Test-Path variable:script:headers) -or $null -eq $script:headers) {
            throw 'XDR connection headers are not initialized. Run Set-XdrConnectionSettings first.'
        }

        $mdiHeaders = @{}
        foreach ($key in $script:headers.Keys) {
            $mdiHeaders[$key] = $script:headers[$key]
        }

        if ($IncludeTenantId) {
            $tenantId = $null
            $tenantIdCache = Get-XdrCache -CacheKey 'XdrTenantId' -ErrorAction SilentlyContinue
            if ($null -ne $tenantIdCache) {
                if ($tenantIdCache -is [string]) {
                    $tenantId = $tenantIdCache
                } elseif ($tenantIdCache.PSObject.Properties['Value']) {
                    $tenantId = [string]$tenantIdCache.Value
                }
            }

            if (-not [string]::IsNullOrWhiteSpace($tenantId)) {
                $mdiHeaders['tenant-id'] = $tenantId
                if (-not $mdiHeaders.ContainsKey('x-tid')) {
                    $mdiHeaders['x-tid'] = $tenantId
                }
            }
        }

        if (-not [string]::IsNullOrWhiteSpace($AcceptLanguage)) {
            $mdiHeaders['accept-language'] = $AcceptLanguage
        }
        if (-not [string]::IsNullOrWhiteSpace($Package)) {
            $mdiHeaders['m-package'] = $Package
        }
        if (-not [string]::IsNullOrWhiteSpace($Type)) {
            $mdiHeaders['m-type'] = $Type
        }
        if (-not [string]::IsNullOrWhiteSpace($Name)) {
            $mdiHeaders['m-name'] = $Name
        }
        if (-not [string]::IsNullOrWhiteSpace($ComponentName)) {
            $mdiHeaders['m-componentName'] = $ComponentName
        }
        if (-not [string]::IsNullOrWhiteSpace($ClientPage)) {
            $mdiHeaders['x-clientpage'] = $ClientPage
        }

        return $mdiHeaders
    }
}