Private/OrbitAPI/Get-OrbitErrorResponseBody.ps1

<#
 
Extracts the response body of a failed Invoke-RestMethod/Invoke-WebRequest call, so the real
Orbit API error message (e.g. field-level validation details) surfaces instead of a generic
"The remote server returned an error" exception.
 
Adapted from https://stackoverflow.com/questions/18771424/how-to-get-powershell-invoke-restmethod-to-return-body-of-http-500-code-response
 
#>

function Get-OrbitErrorResponseBody {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$true)]$ErrorRecord
    )

    if ( $PSVersionTable.PSVersion.Major -lt 6 ) {

        if ( $null -eq $ErrorRecord.Exception.Response ) {
            return $null
        }

        $reader = New-Object System.IO.StreamReader( $ErrorRecord.Exception.Response.GetResponseStream() )
        try {
            $reader.BaseStream.Position = 0
            $reader.DiscardBufferedData()
            $body = $reader.ReadToEnd()
        } finally {
            $reader.Close()
        }

        if ( $body.StartsWith("{") ) {
            return ( $body | ConvertFrom-Json )
        }
        return $body

    }

    return $ErrorRecord.ErrorDetails.Message

}