Private/Invoke-CustomWebRequest.ps1

function Invoke-CustomWebRequest {
    Param (
        [Parameter(ParameterSetName = 'InitRequest', Mandatory)]
        [Parameter(ParameterSetName = 'ApiRequest', Mandatory)]
        [Parameter(ParameterSetName = 'FileDownload', Mandatory)]
        [uri]$Uri,
        [Parameter(ParameterSetName = 'InitRequest')]
        [Parameter(ParameterSetName = 'ApiRequest')]
        [Parameter(ParameterSetName = 'FileDownload')]
        [string]$Cookie = $ModuleWideCookie,
        [Parameter(ParameterSetName = 'InitRequest')]
        [Parameter(ParameterSetName = 'ApiRequest')]
        [Parameter(ParameterSetName = 'FileDownload')]
        [string]$UA = $ModuleWideUA,
        [Parameter(ParameterSetName = 'FileDownload', Mandatory)]
        [string]$OutFile,
        [Parameter(ParameterSetName = 'ApiRequest', Mandatory)]
        [string]$Method,
        [Parameter(ParameterSetName = 'InitRequest', Mandatory)]
        [Parameter(ParameterSetName = 'ApiRequest', Mandatory)]
        [System.Collections.Hashtable]$Headers,
        [Parameter(ParameterSetName = 'ApiRequest', Mandatory)]
        [string]$ContentType,
        [Parameter(ParameterSetName = 'ApiRequest', Mandatory)]
        [object]$Body
    )

    $WebSession = New-Object -TypeName 'Microsoft.PowerShell.Commands.WebRequestSession'
    $WebSession.UserAgent = $UA
    $WebSession.Cookies.Add((New-Object -TypeName 'System.Net.Cookie' -ArgumentList ('d', $Cookie, '/', '.slack.com')))

    $InvokeWebRequestParameters = @{
        UseBasicParsing = $true
        Uri             = $Uri
        WebSession      = $WebSession
    }

    if ($OutFile) {
        $InvokeWebRequestParameters.Add('OutFile', $OutFile)
    }
    if ($Method) {
        $InvokeWebRequestParameters.Add('Method', $Method)
    }
    if ($Headers) {
        $InvokeWebRequestParameters.Add('Headers', $Headers)
    }
    if ($ContentType) {
        $InvokeWebRequestParameters.Add('ContentType', $ContentType)
    }
    if ($Body) {
        $InvokeWebRequestParameters.Add('Body', $Body)
    }

    $CurrentProgressPreference = $ProgressPreference
    $ProgressPreference = 'SilentlyContinue'
    Invoke-WebRequest @InvokeWebRequestParameters
    $ProgressPreference = $CurrentProgressPreference
}