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 }