Private/Http/Invoke-OnypheAPIV2.ps1

    Function Invoke-OnypheAPIV2 {
    [cmdletbinding()]
    Param (
          [parameter(Mandatory=$true)]
          [ValidateNotNullOrEmpty()]
              [string[]]$request,
          [parameter(Mandatory=$false)]
          [ValidateNotNullOrEmpty()]
              [string[]]$data,
          [parameter(Mandatory=$false)]
          [ValidateNotNullOrEmpty()]
              [string]$file,
          [parameter(Mandatory=$false)]
          [Validateset("GET","POST")]
              [string]$Method = "GET",
          [parameter(Mandatory=$true)]
          [ValidateNotNullOrEmpty()]
              [string[]]$APIInfo,
          [parameter(Mandatory=$true)]
          [ValidateNotNullOrEmpty()]
              [string[]]$APIInput,
          [parameter(Mandatory=$true)]
              [Bool]$APIKeyrequired,
          [parameter(mandatory=$false)]
          [ValidateNotNullOrEmpty()]
                [hashtable]$FuncInput,
          [parameter(Mandatory=$false)]
          [ValidateNotNullOrEmpty()]
                [string]$QueryValue,
          [parameter(Mandatory=$false)]
          [ValidateScript({$_ -match "^((?!0)\d+)$"})]
              [string[]]$page,
          [parameter(Mandatory=$false)]
          [ValidateRange(1,10000)]
              [int]$size,
          [parameter(Mandatory=$false)]
              [switch]$TrackQuery,
          [parameter(Mandatory=$false)]
              [switch]$Calculated,
          [parameter(Mandatory=$false)]
              [switch]$UseBetaFeatures,
          [parameter(Mandatory=$false)]
              [switch]$Stream,
          [parameter(Mandatory=$false)]
                [string]$OutFile,
          [parameter(Mandatory=$false)]
          [ValidateRange(1,[int]::MaxValue)]
              [int]$TimeoutSec = 100
    )
    Process {
      if ($UseBetaFeatures) {
          $onypheurl = "https://test.onyphe.io/api/"
          write-verbose -message "using beta Onyphe service - https://test.onyphe.io"
      } else {
          $onypheurl = "https://www.onyphe.io/api/"
          write-verbose -message "using production Onyphe service - https://www.onyphe.io"
      }
      $DateRequest = get-date
      if (($APIKeyrequired)-and(!$global:OnypheAPIKey)) {
          write-verbose -message "incorrect parameter - Please provide an APIKey with -APIKEY parameter"
          throw "Please provide an APIKey with -APIKEY parameter"
      }
      try {
          $CertCallbackOverridden = $false
          $OriginalCertCallback = $null
          $fullonypheurl = "$($onypheurl)$($request)"
          $queryStringParams = @()
          if ($QueryValue) { $queryStringParams += "q=$([System.Uri]::EscapeDataString($QueryValue))" }
          if ($page) { $queryStringParams += "page=$($page)" }
          if ($size) { $queryStringParams += "size=$($size)" }
          if ($TrackQuery) { $queryStringParams += "trackquery=true" }
          if ($Calculated) { $queryStringParams += "calculated=true" }
          if ($queryStringParams.Count -gt 0) {
              $fullonypheurl = "$($fullonypheurl)?$($queryStringParams -join '&')"
          }
          if ($global:OnypheProxyParams) {
              $params = $global:OnypheProxyParams.clone()
              If (!$params.UseBasicParsing){
                  $params.add('UseBasicParsing', $true)
              }
              If (!$params.URI) {
                  $params.add('URI', "$($fullonypheurl)")
              } Else {
                  $params['URI'] = "$($fullonypheurl)"
              }
          } Else {
              $params = @{}
              $params.add('UseBasicParsing', $true)
              $params.add('URI', "$($fullonypheurl)")
          }
          If (!$params.TimeoutSec) {
              $params.add('TimeoutSec', $TimeoutSec)
          }
          if ($UseBetaFeatures) {
              if ($host.Version.Major -lt 6) {
                  try {
                  if (-not ([System.Management.Automation.PSTypeName]'ServerCertificateValidationCallback').Type) {
                      $certCallback = @"
                              using System;
                              using System.Net;
                              using System.Net.Security;
                              using System.Security.Cryptography.X509Certificates;
                              public class ServerCertificateValidationCallback
                              {
                                      public static void Ignore()
                                      {
                                              if(ServicePointManager.ServerCertificateValidationCallback ==null)
                                              {
                                                      ServicePointManager.ServerCertificateValidationCallback +=
                                                              delegate
                                                              (
                                                                      Object obj,
                                                                      X509Certificate certificate,
                                                                      X509Chain chain,
                                                                      SslPolicyErrors errors
                                                              )
                                                              {
                                                                      return true;
                                                              };
                                              }
                                      }
                              }
"@

                          Add-Type $certCallback
                  }
                  $OriginalCertCallback = [System.Net.ServicePointManager]::ServerCertificateValidationCallback
                  [ServerCertificateValidationCallback]::Ignore()
                  $CertCallbackOverridden = $true
                  } catch {
                      throw "impossible to add a new type, check your PowerShell Constrained Language settings or run PowerShell as Admin"
                  }
              } else {
                  $params.add('SkipCertificateCheck', $true)
              }
          }
          if ($data) {
              $params.add('Method','Post')
              $params.add('Body', $data)
              $params.add('ContentType', 'application/json')
          }
          if ($file) {
            $params.add('Method','Post')
            $params.add('Infile', $file)
            $params.add('ContentType', 'application/json')
          }
          if (($Method -eq "POST") -and !$params.Method) {
              $params.add('Method','Post')
          }
          if ($APIKeyrequired) {
              $params.add('Headers', @{'Authorization' = 'apikey {0}' -f $global:OnypheAPIKey})
          }
          if ($Stream -and $OutFile) {
            $params.add('OutFile', $OutFile)
          }
          if ($params.Headers) {
              $redactedHeaders = $params.Headers.Clone()
              if ($redactedHeaders.ContainsKey('Authorization')) {
                  $redactedHeaders['Authorization'] = 'apikey ***redacted***'
              }
              write-verbose -message "Request Headers : $($redactedHeaders | out-string)"
          } else {
              write-verbose -message "Request Headers : none"
          }
          $onypheresult = invoke-webrequest @params
      } catch {
              write-verbose -message "Not able to use onyphe online service - KO"
              write-verbose -message "Error Type: $($_.Exception.GetType().FullName)"
              write-verbose -message "Error Message: $($_.Exception.Message)"
              write-verbose -message "HTTP error code:$($_.Exception.Response.StatusCode.Value__)"
              write-verbose -message "HTTP error message:$($_.Exception.Response.StatusDescription)"
              $errorvalue = $null
              try {
                  if ($_.ErrorDetails.Message) {
                      $errorvalue = $_.ErrorDetails.Message | Convertfrom-Json
                  } elseif (get-member -InputObject $_.Exception.Response -MemberType Method | Where-Object {$_.name -eq "GetResponseStream"}){
                    $result = $_.Exception.Response.GetResponseStream()
                    $reader = New-Object System.IO.StreamReader($result)
                    $reader.BaseStream.Position = 0
                    $httpbody = $reader.ReadToEnd()
                    $errorvalue = $httpbody | Convertfrom-Json
                  }
              } catch {
                  $errorvalue = $null
              }
              if (-not $errorvalue) {
                  $errorvalue = [PSCustomObject]@{
                      Count = 0
                      error = ""
                      myip = 0
                      results = ''
                      'cli-error_results' = "$($_.Exception.GetType().FullName) - $($_.Exception.Message) : $($onypheresult.Content)"
                      status = "ko"
                      took = 0
                      total = 0
                  }
              }
      } finally {
          if ($CertCallbackOverridden) {
              [System.Net.ServicePointManager]::ServerCertificateValidationCallback = $OriginalCertCallback
          }
      }
      if ((-not $errorvalue) -and $onypheresult.Content) {
            write-verbose -message "Response Headers : $($onypheresult.Headers | out-string)"
            write-verbose -message "Web Content : $($onypheresult.Content)"
            $reqresult = $onypheresult.Content
       } else {
        $reqresult = $null
       }
       if ($errorvalue) {
              $errorvalue.PSObject.TypeNames.Insert(0,"PSOnyphe")
              $errorvalue | add-member -MemberType NoteProperty -Name 'cli-API_info' -Value $APIInfo
              $errorvalue | add-member -MemberType NoteProperty -Name 'cli-API_input' -Value $APIInput
              $errorvalue | add-member -MemberType NoteProperty -Name 'cli-API_version' -Value "2"
              $errorvalue | add-member -MemberType NoteProperty -Name 'cli-key_required' -Value $APIKeyrequired
              $errorvalue | add-member -MemberType NoteProperty -Name 'cli-Request_Date' -Value $DateRequest
              $errorvalue | add-member -MemberType NoteProperty -Name 'cli-func_input' -value $FuncInput
              $defaultDisplaySet = $errorvalue.psobject.properties.name | Where-Object {$_ -notlike "cli-*"}
              $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet("DefaultDisplayPropertySet",[string[]]$defaultDisplaySet)
              $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
              $errorvalue | Add-Member MemberSet PSStandardMembers $PSStandardMembers
              $errorvalue
        } elseif ($reqresult) {
                $tempobj = $reqresult | Convertfrom-Json
                $tempobj.PSObject.TypeNames.Insert(0,"PSOnyphe")
                $tempobj | add-member -MemberType NoteProperty -Name 'cli-API_info' -Value $APIInfo
                $tempobj | add-member -MemberType NoteProperty -Name 'cli-API_input' -Value $APIInput
                $tempobj | add-member -MemberType NoteProperty -Name 'cli-API_version' -Value "2"
                $tempobj | add-member -MemberType NoteProperty -Name 'cli-key_required' -Value $APIKeyrequired
                $tempobj | add-member -MemberType NoteProperty -Name 'cli-Request_Date' -Value $DateRequest
                $tempobj | add-member -MemberType NoteProperty -Name 'cli-func_input' -value $FuncInput
                $defaultDisplaySet = $tempobj.psobject.properties.name | Where-Object {$_ -notlike "cli-*"}
                $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet("DefaultDisplayPropertySet",[string[]]$defaultDisplaySet)
                $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet)
                $tempobj | Add-Member MemberSet PSStandardMembers $PSStandardMembers
                if ($size -and ($null -ne $tempobj.count) -and ($null -ne $tempobj.total) -and ($tempobj.count -lt $size) -and ($tempobj.total -gt $tempobj.count)) {
                    Write-Warning -Message "Onyphe returned $($tempobj.count) result(s) for this page, fewer than the requested -Size $($size) - this account/subscription's real per-page ceiling is lower than what was requested (the API silently falls back to its default page size instead of erroring). Use -Page to retrieve additional results rather than relying on a larger -Size."
                }
                $tempobj
        }
      }
    }