ps/Modules/Alkami.PowerShell.Choco/Public/Invoke-ProgetRequest.ps1
2023-05-30 22:51:22 -07:00

72 lines
2.3 KiB
PowerShell

function Invoke-ProgetRequest {
<#
.SYNOPSIS
USed for making fault tolerant web requests to proget
.EXAMPLE
$response = Invoke-ProgetRequest -URI $uri -Headers $headers
.PARAMETER URI
Proget URI to make request against
.PARAMETER Headers
Generally used for auth header, but accepts any header
.OUTPUTS
Response from invoke web request to Proget
.NOTES
Uses Invoke-CommandWithRetry to retry requests to recover from transient failures
#>
[cmdletbinding()]
[OutputType([Microsoft.PowerShell.Commands.WebResponseObject])]
param (
[Parameter(Mandatory = $true)]
$URI,
[Parameter(Mandatory = $true)]
$Headers
)
if ($null -eq $Headers) {
$Headers = @{}
}
$loglead = (Get-LogLeadName)
$retryStatusCodes = @(
[System.Net.HttpStatusCode]::BadGateway,
[System.Net.HttpStatusCode]::BadRequest,
[System.Net.HttpStatusCode]::GatewayTimeout,
[System.Net.HttpStatusCode]::InternalServerError,
[System.Net.HttpStatusCode]::ServiceUnavailable
)
Write-Host "$logLead : Performing web request to $($URI)"
$command = {
try {
$response = Invoke-WebRequest $URI -UseBasicParsing -Headers $headers
if ($response.StatusCode -ne "200") {
throw "Non-success Statuscode found was $($response.StatusCode)"
}
} catch [System.Net.WebException] {
if ($null -eq $_.Exception.Response -and $_.Exception.Message -eq "The operation has timed out.") {
Write-Host "$logLead : No response object found. Request timed out. throwing"
throw $_
}
} catch {
Write-Host "Exception $($_.Exception.Message)"
Write-Host "$logLead : Response code: $($response.StatusCode)"
if ($retryStatusCodes -contains $response.StatusCode) {
Write-Host "$logLead : retry code Detected, throwing"
throw $_
}
if ($response.StatusCode -ne "200") {
Write-Host "Non-success Statuscode found was $($response.StatusCode)"
throw $_
}
}
return $response
}
$response = Invoke-CommandWithRetry -ScriptBlock $command -Exponential
Write-Host "$logLead : Done Trying to $($URI)"
return $response
}