Якщо Jint повідомляє про відсутність dnsResolve або myIpAddress під час оцінювання PAC, завантаження додаткового JavaScript не обов'язково є рішенням. Ці помічники PAC належать до середовища, яке надає хост-застосунок.

Перед викликом FindProxyForURL

Виберіть підтримуваний набір помічників PAC і родини адрес, потім установіть ці помічники в рушій. Зберігайте їхні контракти: dnsResolve приймає ім'я хоста, myIpAddress не приймає аргументів і потребує політики локального інтерфейсу, а shExpMatch використовує шаблони в стилі оболонки. Заглушка, що повертає зручне значення, може непомітно вибрати неправильний маршрут.

Після такої ініціалізації основний виклик може виглядати так у Jint 4.4.0:

var destination = new Uri(destinationUrl);
engine.Execute(pacSource);
var routeList = engine.Invoke(
    "FindProxyForURL",
    destinationUrl,
    destination.IdnHost
).AsString();

engine — це налаштований Jint.Engine; pacSource — отримана програма PAC. destination.IdnHost надає ім'я хоста без порту та шляху. Цей виклик не отримує PAC і не відкриває проксі-з'єднання.

Після виклику

Результат на кшталт PROXY proxy.example:8080; DIRECT інтерпретуйте як упорядкований список кандидатів маршрутів і резерву. Передавання всього цього рядка як URL проксі втрачає його сенс. Тримайте помилку оцінювання окремо від явного результату DIRECT.

Поки він працює

Налаштуйте обмеження Jint щодо тривалості, інструкцій, пам'яті та скасування і надавайте лише потрібні функції хоста. Обмежуйте зворотні виклики DNS окремо: перевірки виконання JavaScript не роблять довільний блокуючий виклик хоста перериваним. Серіалізуйте доступ до рушія або надавайте паралельній роботі окремо власні екземпляри; рушії не безпечні для одночасного використання.

Реалізації PAC у браузерах можуть відрізнятися розширеннями помічників і деталями URL, які вони розкривають, особливо для HTTPS. Збіг з одним зразковим результатом доводить менше, ніж збіг із поведінкою маршрутизації браузера.

Схожі статті