Functions/PagedRequest.ps1

function Invoke-AzDevOpsRestPage {
    param ([string]$Uri, [hashtable]$Headers)

    $responseHeaders = $null
    if ($PSVersionTable.PSVersion.Major -lt 6) {
        $response = Invoke-WebRequest -Uri $Uri -Method Get -Headers $Headers -UseBasicParsing -ErrorAction Stop
        return [pscustomobject]@{ Body = ($response.Content | ConvertFrom-Json); Headers = $response.Headers }
    }
    $body = Invoke-RestMethod -Uri $Uri -Method Get -Headers $Headers -ResponseHeadersVariable responseHeaders -ErrorAction Stop
    [pscustomobject]@{ Body = $body; Headers = $responseHeaders }
}

function Invoke-AzDevOpsPagedRequest {
    [CmdletBinding()]
    param ([string]$Uri, [hashtable]$Headers)

    $items = @()
    $requestUri = $Uri
    $seenTokens = @()
    do {
        $page = Invoke-AzDevOpsRestPage -Uri $requestUri -Headers $Headers
        $response = $page.Body
        $responseHeaders = $page.Headers
        if ($response -is [string]) { throw 'The collection endpoint returned an invalid response.' }
        Set-AzDevOpsMissingCollectionData -Data $response -RequiredProperties 'value'
        if ($null -eq $response -or 'value' -notin $response.PSObject.Properties.Name -or $null -eq $response.value) {
            throw 'The collection endpoint omitted its result list.'
        }
        $items += @($response.value)
        $continuationToken = if ($responseHeaders) { @($responseHeaders['x-ms-continuationtoken'])[0] } else { $null }
        if ($continuationToken) {
            if ($continuationToken -cin $seenTokens) { throw 'The collection endpoint repeated a continuation token.' }
            $seenTokens += $continuationToken
            $requestUri = $Uri + '&continuationToken=' + [uri]::EscapeDataString($continuationToken)
            $Headers = $script:connection.GetHeader()
        }
    } while ($continuationToken)
    [pscustomobject]@{ value = $items }
}