#if !UNITY_WEBGL || UNITY_EDITOR
using System;
using System.Linq;
using Best.HTTP.Hosts.Connections;
using Best.HTTP.Shared;
// Examples on proxy strings:
// https://gist.github.com/yougg/5d2b3353fc5e197a0917aae0b3287d64
namespace Best.HTTP.Proxies.Autodetect
{
///
/// Based on 's "Environment Variables" section.
///
public sealed class EnvironmentProxyDetector : IProxyDetector
{
private Proxy _cachedProxy;
Proxy IProxyDetector.GetProxy(HTTPRequest request)
{
if (this._cachedProxy != null)
return this._cachedProxy;
string proxyUrl = null;
if (HTTPProtocolFactory.IsSecureProtocol(request.CurrentUri))
{
proxyUrl = GetEnv("HTTPS_PROXY");
HTTPManager.Logger.Information(nameof(EnvironmentProxyDetector), $"{nameof(IProxyDetector.GetProxy)} - HTTPS_PROXY: '{proxyUrl}'", request.Context);
}
else
{
proxyUrl = GetEnv("HTTP_PROXY");
HTTPManager.Logger.Information(nameof(EnvironmentProxyDetector), $"{nameof(IProxyDetector.GetProxy)} - HTTP_PROXY: '{proxyUrl}'", request.Context);
}
if (proxyUrl == null)
{
proxyUrl = GetEnv("ALL_PROXY");
}
else
HTTPManager.Logger.Information(nameof(EnvironmentProxyDetector), $"{nameof(IProxyDetector.GetProxy)} - ALL_PROXY: '{proxyUrl}'", request.Context);
if (string.IsNullOrEmpty(proxyUrl))
return null;
// if the url is just a host[:port], add the http:// part too. Checking for :// should keep and treat the socks:// scheme too.
if (proxyUrl.IndexOf("://") == -1 && !proxyUrl.StartsWith("http", StringComparison.OrdinalIgnoreCase))
proxyUrl = "http://" + proxyUrl;
string exceptionList = null;
try
{
var proxyUri = new Uri(proxyUrl);
Proxy proxy = null;
if (proxyUri.Scheme.StartsWith("socks", StringComparison.OrdinalIgnoreCase))
proxy = new SOCKSProxy(proxyUri, null);
else
proxy = new HTTPProxy(proxyUri);
// A comma-separated list of host names that should not go through any proxy is set in (only an asterisk, * matches all hosts)
exceptionList = GetEnv("NO_PROXY");
if (!string.IsNullOrEmpty(exceptionList))
proxy.Exceptions = exceptionList.Split(';').ToList();
return this._cachedProxy = proxy;
}
catch (Exception ex)
{
HTTPManager.Logger.Exception(nameof(EnvironmentProxyDetector), $"GetProxy - proxyUrl: '{proxyUrl}', exceptionList: '{exceptionList}'", ex, request.Context);
}
return null;
}
string GetEnv(string key) => System.Environment.GetEnvironmentVariable(key) ?? System.Environment.GetEnvironmentVariable(key.ToLowerInvariant());
}
}
#endif