Как проверить ответ сценария Pac - PullRequest
2 голосов
/ 29 сентября 2019

Мне нужно получить ответ pacScript в моем расширении chrome. A pacScript вернет строку DIRECT, если нам не нужен прокси-сервер, и я хочу это обнаружить.

var config = {
        mode: "pac_script",
        pacScript: {
          url: "https://www.example.com/proxy.pac"
        }
      };

chrome.proxy.settings.set({value: config, scope: 'regular'},function() {
    //how can i get the pac response string here 
});

Редактировать: я пытался использовать JQuery.getScript для загрузки FindProxyForURL из удаленного pac-файла, но теперь специфичные для pac функции, такие как isPlainHostName, теперь не определены.

Я мог получить реализации из mozilla но должен быть лучший способ, поскольку это функции браузера, которые уже должны были быть доступны.

1 Ответ

3 голосов
/ 06 октября 2019

То, что вы пытаетесь сделать, просто невозможно. Это потому, что pac-файл оценивается для каждого URL, который вы запрашиваете. Таким образом, «строка ответа pac» не является константой, которую можно вернуть при настройке параметров прокси.

Если вы пытаетесь отладить свой pac-файл, вы можете alert('settings') внутри FindProxyForURL простоперед возвратом настроек. Предупреждение создает запись в журнале, к которой можно получить доступ с помощью функции chrome://net-internals/#events.

Если вы хотите только проверить, использует ли пользователь прямое соединение или прокси, вы можете сравнить внешний IP-адрес до и после настройки проксинастройки. Оформить заказ ipify.org или вы даже можете использовать скрипт на своем веб-сервере.

Вот пример кода для этого:

let originalIp = "";

async function getCurrentIp() {
    var res = await fetch('http://api.ipify.org/');
    return await res.text();
}

// Get ip before setting proxy
getCurrentIp().then(ip => {
    originalIp = ip;
});

var config = {
    mode: "pac_script",
    pacScript: {
        url: "https://www.example.com/proxy.pac"
    }
};

chrome.proxy.settings.set({
    value: config,
    scope: 'regular'
}, function() {
    // Get ip after setting proxy and compare it with original ip
    getCurrentIp().then(ip => {
        if (ip == originalIp)
            console.log('DIRECT');
        else
            console.log('PROXY: ' + ip)
    })
});
...