Если 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. Совпадение с одним примером результата доказывает меньше, чем совпадение с поведением маршрутизации браузера.

Похожие статьи