Private/Helper/Get-CWMRetryDelay.ps1

function Get-CWMRetryDelay {
    # Seconds to wait before retry number $Attempt: the server's Retry-After when present, otherwise
    # exponential backoff (2, 4, 8, 16, 32 seconds). Capped at 60 seconds.
    [CmdletBinding()]
    [OutputType([int])]
    param($Response, [int]$Attempt)

    $MaxDelay = 60
    $Delay = $null
    try {
        if ($Response -and $Response.Headers) {
            $RetryAfter = $Response.Headers.RetryAfter # 7: System.Net.Http.Headers.RetryConditionHeaderValue
            if ($RetryAfter) {
                if ($RetryAfter.Delta) { $Delay = [int][math]::Ceiling($RetryAfter.Delta.TotalSeconds) }
                elseif ($RetryAfter.Date) { $Delay = [int][math]::Ceiling(($RetryAfter.Date - [DateTimeOffset]::UtcNow).TotalSeconds) }
            }
            else {
                $Value = $Response.Headers['Retry-After'] # 5.1: WebHeaderCollection string
                if ($Value) {
                    $Seconds = 0
                    $Date = [DateTimeOffset]::MinValue
                    if ([int]::TryParse($Value, [ref]$Seconds)) { $Delay = $Seconds }
                    elseif ([DateTimeOffset]::TryParse($Value, [ref]$Date)) { $Delay = [int][math]::Ceiling(($Date - [DateTimeOffset]::UtcNow).TotalSeconds) }
                }
            }
        }
    }
    catch { $Delay = $null }

    if ($null -eq $Delay -or $Delay -lt 1) { $Delay = [int][math]::Pow(2, $Attempt) }
    [math]::Min($Delay, $MaxDelay)
}