Public/Test-ProxyDetection.ps1

#
# Function: Test-ProxyDetection
# Public function for the GSA client diagnostics toolkit.
#
function Test-ProxyDetection
{
    <#
.SYNOPSIS
    Detects outbound proxy presence via system config, transparent proxy headers, and HTTP 407 responses.
.PARAMETER TestUrlHttp
    HTTP URL used for transparent proxy header detection.
.PARAMETER TestUrlHttps
    HTTPS URL used for authenticating proxy (407) detection.
.PARAMETER TimeoutSec
    Request timeout in seconds.
.PARAMETER PassThru
    Returns the proxy detection result object. By default the result is only logged.
.PARAMETER LogLevel
    Sets the minimum log level written by the module. Valid values are ERROR, WARNING, INFO, DEBUG, and SUCCESS.
.OUTPUTS
    PSCustomObject when -PassThru is specified. The object contains the proxy detection results.
#>

    [CmdletBinding()]
    param (
        [string]$TestUrlHttp = "http://www.msftconnecttest.com/connecttest.txt",
        [string]$TestUrlHttps = "https://www.microsoft.com",
        [int]$TimeoutSec = 10,
        [switch]$PassThru,
        [ValidateSet("ERROR", "WARNING", "INFO", "DEBUG", "SUCCESS")]
        [string]$LogLevel
    )

    if ($PSBoundParameters.ContainsKey('LogLevel'))
    { $script:LogLevel = $LogLevel }

    $result = [PSCustomObject]@{
        ProxyFound                  = $false
        SystemProxyConfigured       = $false
        ProxyAddress                = $null
        TransparentProxyDetected    = $false
        AuthenticatingProxyDetected = $false
        Passed                      = $true
        Warnings                    = 0
    }

    # Check system proxy via netsh
    try
    {
        $netshOutput = netsh winhttp show proxy 2>&1
        if ($netshOutput -match "Direct access")
        {
            $result.SystemProxyConfigured = $false
            Write-Log -Message "System proxy is not configured (Direct access mode)." -Level "INFO" -Color Green
        }
        else
        {
            $result.SystemProxyConfigured = $true
            Write-Log -Message "System proxy is configured." -Level "INFO" -Color Yellow
            if ($netshOutput -match "Proxy Server\s*:\s*(.+)")
            {
                $result.ProxyAddress = $matches[1].Trim()
                Write-Log -Message "Detected system proxy address: $($result.ProxyAddress)" -Level "WARNING" -Color Yellow
                $result.ProxyFound = $true
                $result.Warnings++
            }
        }
    }
    catch
    {
        Write-Log -Message "Error retrieving system proxy settings: $($_.Exception.Message)" -Level "ERROR" -Color Red
        $result.Passed = $false
    }

    # Check gRPC proxy environment variable
    if (Test-grpcProxy)
    {
        Write-Log -Message "grpc_proxy variables are set." -Level "WARNING" -Color Yellow
        $result.Warnings++
    }
    else
    {
        Write-Log -Message "NO grpc_proxy environment variables are set." -Level "INFO" -Color Green
    }

    # Check WinHTTP/WebRequest proxy
    $proxy = Test-SystemWebProxy -TargetUrl 'http://www.microsoft.com'
    if ($proxy)
    {
        Write-Log -Message "SystemWebProxy: Found proxy: $proxy" -Level "WARNING" -Color Yellow
        $result.ProxyFound = $true
        $result.Warnings++
    }
    else
    {
        Write-Log -Message "SystemWebProxy: Direct connection will be used." -Level "INFO" -Color Green
    }

    # Transparent proxy detection via HTTP headers
    try
    {
        $responseHttp = Invoke-WebRequest -Uri $TestUrlHttp -UseBasicParsing -TimeoutSec $TimeoutSec
        Write-Log -Message "HTTP test request to $TestUrlHttp succeeded." -Level "INFO" -Color Green

        if ($responseHttp.Headers["Via"] -or $responseHttp.Headers["X-Forwarded-For"])
        {
            $result.TransparentProxyDetected = $true
            Write-Log -Message "Transparent proxy detected via HTTP header(s): $responseHttp.Headers" -Level "WARNING" -Color Yellow
            $result.ProxyFound = $true
            $result.Warnings++
        }
    }
    catch
    {
        Write-Log -Message "HTTP test error: $($_.Exception.Message)" -Level "ERROR" -Color Red
        $result.Passed = $false
    }

    # Authenticating proxy detection via HTTP 407
    try
    {
        Invoke-WebRequest -Uri $TestUrlHttps -UseBasicParsing -TimeoutSec $TimeoutSec -ErrorAction Stop | Out-Null
        Write-Log -Message "HTTPS test request to $TestUrlHttps succeeded." -Level "INFO" -Color Green
    }
    catch
    {
        if ($_.Exception.Response -and $_.Exception.Response.StatusCode -eq 407)
        {
            $result.AuthenticatingProxyDetected = $true
            Write-Log -Message "Authenticating proxy detected (HTTP 407 response)." -Level "WARNING" -Color Yellow
            $result.ProxyFound = $true
            $result.Warnings++
        }
        else
        {
            Write-Log -Message "HTTPS test error: $($_.Exception.Message)" -Level "ERROR" -Color Red
            $result.Passed = $false
        }
    }

    if ($PassThru)
    {
        return $result
    }
}