ps/Modules/Alkami.PowerShell.Choco/Public/Invoke-ProgetRequest.ps1

72 lines
2.3 KiB
PowerShell
Raw Normal View History

2023-05-30 22:51:22 -07:00
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
}