在 C# (WPF) 中解析 proxy.pac 文件
Parsing a proxy.pac file in C# (WPF)
我需要在 C# 代码中解析一个 proxy.pac。通过 WebProxy 方法获取代理不是一个选项,因为我从文件而不是当前系统读取代理设置。
我尝试使用 Jint 和 ClearScript 在 C# 代码中使用嵌套的 JavaScript 引擎。但最终都未能阅读我的 proxy.pac.
中的 "shExpMatch"-方法
该文件非常简单,适用于我当前的系统:
function FindProxyForURL(url, host) {
if (shExpMatch(host, "192.*")) {
return "DIRECT";
}
return "PROXY proxyServer:8080; PROXY proxyServer2:80";
}
此工具的旧实现是使用 Microsoft.JScript.Vsa.VsaEngine.CreateEngine();自 Visual Studio 2005 年(10 多年前!)以来已弃用,他们所做的只是:启动 JS 引擎,读取或下载并读取文件,结果 = engine.evaluate(script)。然后他们可以将这个结果对象与新的 url 和主机等一起使用。
为什么 none 这些 JS 引擎知道 shExpMatch 方法?
浏览器提供给 proxy.pac 代码的 API 不是 JavaScript 标准的一部分,因此通用的 JavaScript 引擎,例如 Jint 和 V8 不t 提供 shExpMatch
等方法。浏览器(或其他主机)有责任公开此 API.
编辑:看看 Mozilla 的实现 here。其中大部分位于 pacUtils
字符串中。您可以在 C# 代码中定义此字符串并将其传递到您的脚本引擎中。那就只剩下dnsResolve
、myIpAddress
、alert
,这些都需要宿主的帮助。这是一个 ClearScript 示例:
Func<string, string> dnsResolve = name => {
var addrs = Dns.GetHostEntry(name).AddressList;
return addrs.First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString();
};
engine.Execute(pacUtils);
engine.Script.dnsResolve = dnsResolve;
engine.Script.myIpAddress = new Func<string>(() => dnsResolve(Dns.GetHostName()));
engine.Script.alert = new Action<string>(msg => Console.WriteLine("PAC-alert: " + msg));
设置完成后,您应该能够执行您的 proxy.pac 代码。
[Edit2:]更新 link 到 Mozilla 的实现。
我需要在 C# 代码中解析一个 proxy.pac。通过 WebProxy 方法获取代理不是一个选项,因为我从文件而不是当前系统读取代理设置。
我尝试使用 Jint 和 ClearScript 在 C# 代码中使用嵌套的 JavaScript 引擎。但最终都未能阅读我的 proxy.pac.
中的 "shExpMatch"-方法该文件非常简单,适用于我当前的系统:
function FindProxyForURL(url, host) {
if (shExpMatch(host, "192.*")) {
return "DIRECT";
}
return "PROXY proxyServer:8080; PROXY proxyServer2:80";
}
此工具的旧实现是使用 Microsoft.JScript.Vsa.VsaEngine.CreateEngine();自 Visual Studio 2005 年(10 多年前!)以来已弃用,他们所做的只是:启动 JS 引擎,读取或下载并读取文件,结果 = engine.evaluate(script)。然后他们可以将这个结果对象与新的 url 和主机等一起使用。
为什么 none 这些 JS 引擎知道 shExpMatch 方法?
浏览器提供给 proxy.pac 代码的 API 不是 JavaScript 标准的一部分,因此通用的 JavaScript 引擎,例如 Jint 和 V8 不t 提供 shExpMatch
等方法。浏览器(或其他主机)有责任公开此 API.
编辑:看看 Mozilla 的实现 here。其中大部分位于 pacUtils
字符串中。您可以在 C# 代码中定义此字符串并将其传递到您的脚本引擎中。那就只剩下dnsResolve
、myIpAddress
、alert
,这些都需要宿主的帮助。这是一个 ClearScript 示例:
Func<string, string> dnsResolve = name => {
var addrs = Dns.GetHostEntry(name).AddressList;
return addrs.First(a => a.AddressFamily == AddressFamily.InterNetwork).ToString();
};
engine.Execute(pacUtils);
engine.Script.dnsResolve = dnsResolve;
engine.Script.myIpAddress = new Func<string>(() => dnsResolve(Dns.GetHostName()));
engine.Script.alert = new Action<string>(msg => Console.WriteLine("PAC-alert: " + msg));
设置完成后,您应该能够执行您的 proxy.pac 代码。
[Edit2:]更新 link 到 Mozilla 的实现。