Public/Send-WIApi.ps1
function Send-WIApi { <# .SYNOPSIS Send a request to the Webinspect REST API. .DESCRIPTION Send a request to the WebInspect REST API. This function is used by other PS4WI functions. It's a simple wrapper you could use for calls to the WebInspect API. .PARAMETER Method REST API Method (Get, Post, Put, Delete ...). Defaults to Get. .PARAMETER Operation WebInspect API Operation to call, e.g. /scanner/scans, this will be appended to $ApiUri .PARAMETER Body Hash table of arguments to send to the WebInspect API. .PARAMETER BodyFile A File containing the Body to be sent to the WebInspect API. .PARAMETER ContentType Content Type to send, if not specified defaults to "application/json". .PARAMETER ApiUri WebInspect API Uri to use, e.g. http://localhost:8083. If empty, the value from PS4WI will be used. .PARAMETER AuthMethod WebInspect API Authentication Method to use. If empty, the value from PS4WI will be used. .PARAMETER Credential A previously created Credential object to be used. .PARAMETER Proxy Proxy server to use. If empty, the value from PS4WI will be used. .PARAMETER ForceVerbose If specified, don't explicitly remove verbose output from Invoke-RestMethod *** WARNING *** This will expose your data in verbose output. .EXAMPLE # Get a list of completed scans with the word "test" in their name $Body = @{ name = test status = complete } Send-WIApi -Operation "/scanner/scans" -Body $Body -ForceVerbose .FUNCTIONALITY WebInspect. #> [OutputType([String])] [CmdletBinding()] param ( [ValidateNotNullOrEmpty()] [ValidateSet('Get', 'Post', 'Put', 'Delete', 'Patch')] [string]$Method, [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string]$Operation, [ValidateNotNullOrEmpty()] [hashtable]$Body, [Parameter(Mandatory=$false)] [string]$BodyFile, [Parameter(Mandatory=$false)] [string]$ContentType = 'application/json', [ValidateNotNullOrEmpty()] [ValidateScript({ if (-not $_ -and -not $Script:PS4WI.ApiUri) { throw 'Please supply a WebInspect Api Uri with Set-WIConfig.' } else { $true } })] [string]$ApiUri = $Script:PS4WI.ApiUri, [Parameter()] [ValidateSet('None', 'Basic', 'Windows', 'ClientCertificate')] [ValidateNotNullOrEmpty()] [ValidateScript({ if (-not $_ -and -not $Script:PS4WI.AuthMethod) { throw 'Please supply a WebInspect AuthMethod with Set-WIConfig.' } else { $true } })] [string]$AuthMethod = $Script:PS4WI.AuthMethod, [Parameter()] [System.Management.Automation.PSCredential] [System.Management.Automation.Credential()] [ValidateNotNullOrEmpty()] [ValidateScript({ if (-not $_ -and -not $Script:PS4WI.Credential) { throw 'Please specify a Credential object or store a Credential object with Set-WIConfig.' } else { $true } })] $Credential = $Script:PS4WI.Credential, [Parameter()] [ValidateNotNullOrEmpty()] [string]$Proxy = $Script:PS4WI.Proxy, [switch]$ForceVerbose = $Script:PS4WI.ForceVerbose ) begin { $Params = @{ Uri = "$ApiUri$Operation" ErrorAction = 'Stop' } if (-not $Method) { $Method = 'Get' } if ($Method -eq 'Get') { $Params.Add('Method', 'Get') $Params.Add('Body', $Body) } elseif ($BodyFile) { Write-Verbose "BodyFile is $BodyFile" $Params.Add('Method', $Method) $Params.Add('ContentType', 'application/json') $Params.Add('InFile', $BodyFile) } else { $Params.Add('Method', $Method) $Params.Add('ContentType', 'application/json') $Params.add('Body', (ConvertTo-Json -Depth 5 $Body)) } if ($Proxy) { $Params['Proxy'] = $Proxy } if ($ForceVerbose) { $Params.Add('Verbose', $True) $VerbosePreference = "Continue" } $Headers = @{ 'Accept' = "application/json" } if ($AuthMethod -eq "None") { Write-Verbose "Using 'None' for Authentication Method" } elseif ($AuthMethod -eq "Windows") { Write-Verbose "Using 'Windows' (as current user) for Authentication Method" $Params.add("UseDefaultCredentials", $true) } elseif ($AuthMethod -eq "Basic") { if (!$Credential) { throw "A Credential object is required for AuthMethod: $AuthMethod" } $UserName = $Credential.UserName Write-Verbose "Using 'Basic' (as $UserName) for Authentication Method" $Password = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Credential.Password)) $CredPair = "$($UserName):$($Password)" $EncodedCredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($credPair)) $Headers.Add('Authorization', "Basic $EncodedCredentials") } elseif ($AuthMethod -eq "ClientCertificate") { Write-Error "ClientCertificate Authentication Method is not yet supported" Exit } else { throw "Unsupported Authentication Method: $AuthMethod" } Write-Verbose "Send-WIApi Bound Parameters: $( $PSBoundParameters | Remove-SensitiveData | Out-String )" } process { $Response = $null try { if ($Body) { Write-Verbose "JSON Payload:" Write-Verbose (ConvertTo-Json -Depth 4 $Body | % { [regex]::Unescape($_) }) } $Response = Invoke-RestMethod -Headers $Headers @Params } catch { Write-Error -Exception $_.Exception -Message "WebInspect API call failed: $_" } } end { if ($Response) { Write-Output $Response } else { Write-Verbose "Response is empty." } } } |