Pax8API/Private/Get-Pax8RetryDelay.ps1
|
function Get-Pax8RetryDelay { [CmdletBinding()] param ( [object]$Headers, [int]$Attempt, [int]$DefaultSeconds = 2 ) $retryAfter = $null if ($Headers) { if ($Headers -is [System.Collections.IDictionary] -and $Headers.Contains('Retry-After')) { $retryAfter = $Headers['Retry-After'] } elseif ($Headers.PSObject.Properties['Retry-After']) { $retryAfter = $Headers.'Retry-After' } } if ($retryAfter -is [array]) { $retryAfter = $retryAfter | Select-Object -First 1 } $seconds = 0 if ($retryAfter -and [int]::TryParse([string]$retryAfter, [ref]$seconds)) { return [Math]::Max(1, $seconds) } $retryDate = [datetimeoffset]::MinValue if ($retryAfter -and [datetimeoffset]::TryParse([string]$retryAfter, [ref]$retryDate)) { return [Math]::Max(1, [int][Math]::Ceiling(($retryDate - [datetimeoffset]::UtcNow).TotalSeconds)) } $backoff = [Math]::Min(60, $DefaultSeconds * [Math]::Pow(2, [Math]::Max(0, $Attempt - 1))) $jitter = Get-Random -Minimum 0 -Maximum 1000 [int][Math]::Ceiling($backoff + ($jitter / 1000)) } |